home *** CD-ROM | disk | FTP | other *** search
/ Gekikoh Dennoh Club 2 / Gekikoh Dennoh Club Vol. 2 (Japan).7z / Gekikoh Dennoh Club Vol. 2 (Japan) (Track 01).bin / fsw / zm302 / zm302_s.lzh / ZMSC1.HAS < prev    next >
Text File  |  1997-08-18  |  473KB  |  20,891 lines

  1. *残されたやるべきこと
  2. *使われていないFM音色などを吐き出す処理
  3. *[繰り返しコマンド/gosubはトラックパターンデータとしては登録できない(演奏時のZMD書き換えがあるから)]
  4. ******************************************************************************
  5. *[リストは基本的に非常駐(使い捨て)のコンパイラの姿を呈し、常駐時に自己書き換えで変身する]
  6. *-------------------------------------------------------
  7. *    ZMUSIC VERSION 3.0 MML COMPILER
  8. *-------------------------------------------------------
  9.  
  10.     .cpu        68000
  11.     .nlist
  12.     .include    doscall.mac
  13.     .include    iocscall.mac
  14.     .include    table.mac
  15.     .include    z_global.mac
  16.     .include    label.mac
  17.     .include    zmd.mac
  18.     .include    zmid.mac
  19.     .include    zmcall.mac
  20.     .include    error.mac
  21.     .include    zclabel.mac
  22.     .include    zcmacro.s
  23.     .list
  24.     .text
  25.     .lall
  26. stack:        equ    $4000
  27. t_trk_no_max:    equ    128        *(t1,...)で一度に書けるトラック番号の数
  28. OCTAVE_UP:    equ    '<'
  29. OCTAVE_DOWN:    equ    '>'
  30. DIRECT_LEN:    equ    '*'
  31. max_macro_param:    equ    255    *マクロに与えることのできるパラメータ数の上限値
  32.  
  33. begin_of_prog:
  34. device_driver0:
  35.     dc.l    -1
  36.     dc.w    $8020            *char,ioctrl不可,raw
  37.     dc.l    strategy_entry0
  38.     dc.l    interrupt_entry0
  39. dev_name0:
  40.     dc.b    ' Z-MUSIC'
  41. pack_ptr0:
  42.     dc.l    0
  43. func_tbl0:
  44.     dc.l    dev_init-func_tbl0    *0  初期化
  45.     dc.l    not_com-func_tbl0    *1  エラー
  46.     dc.l    not_com-func_tbl0    *2  無効
  47.     dc.l    not_com-func_tbl0    *3  (ioctrlによる入力)
  48.     dc.l    not_com-func_tbl0    *4  (入力)
  49.     dc.l    ok_com-func_tbl0    *5  1バイト先読み入力
  50.     dc.l    ok_com-func_tbl0    *6  入力ステータスチェック
  51.     dc.l    ok_com-func_tbl0    *7  入力バッファクリア
  52.     dc.l    dev_out-func_tbl0    *8  出力(verify off)
  53.     dc.l    dev_out-func_tbl0    *9  出力(verify on)
  54.     dc.l    ok_com-func_tbl0    *10 出力ステータスチェック
  55.     dc.l    ok_com-func_tbl0    *11 無効
  56.     dc.l    not_com-func_tbl0    *12 ioctrlによる出力
  57.  
  58. interrupt_entry0:
  59.     movem.l    d0/a4-a5,-(sp)
  60.     movea.l    pack_ptr0(pc),a5
  61.     moveq.l    #0,d0            *d0.l=com code
  62.     move.b    2(a5),d0
  63.     add.w    d0,d0
  64.     add.w    d0,d0
  65.     move.l    func_tbl0(pc,d0.w),d0
  66.     jsr    func_tbl0(pc,d0.l)    *jump tableで参照したところへ…
  67.     move.b    d0,3(a5)        *終了ステータスをセット
  68.     lsr.w    #8,d0
  69.     move.b    d0,4(a5)
  70.     movem.l    (sp)+,d0/a4-a5
  71.     rts
  72.  
  73. strategy_entry0:
  74.     move.l    a5,pack_ptr0
  75.     rts
  76.  
  77. not_com:
  78.     move.w    #$5003,d0    *無視/中止,無効
  79.     rts
  80. dev_out:
  81. ok_com:
  82.     clr.w    d0        *no error
  83.     rts
  84.  
  85. version_id:
  86.         dc.b    'ZCmPlR'    *ID
  87. ver_num:    dc.b    v_code        *ZMUSIC COMPILER VERSION NUMBER
  88.         dc.b    v_code_+ver_type
  89.  
  90. *-----------------------------------------------------------------------------
  91. compiler:                *COMPILE
  92.     *   cmd=$02
  93.     * < d1.l=mode
  94.     *    d0-d6:検出するエラーの最大/0:∞,1-127
  95.     *    d12:V2モードか(0:no,1:yes)
  96.     *    d15:エラーテーブルリストを作成して出力するか(0:no,1:yes)
  97.     * < d2.l=size
  98.     * < a1.l=source address    (a1=d2=0でコンパイラ解除)
  99.     *-------
  100.     * > d0.l=num. of error
  101.     * > a0.l=error table (if required/to be free)
  102.     *    (error code.w,error line.l)
  103.     *-------
  104.     * > d0.l=0:no error
  105.     * > a0.l=object address
  106.     *   0(a0)~7(a0)=ZMD standard header
  107.     *   8(a0)~ZMD
  108.     *   (ウォーニングがあればZMDデータの後ろにくっついている)
  109.     *------- release compiler case
  110.     * > d0.l=0:no error/nz error
  111.     lea    work,a6
  112.     move.l    sp,sp_buf-work(a6)        *スタック保存
  113.     move.l    d1,compile_option-work(a6)    *save mode
  114.     move.l    d2,d4
  115.     add.l    a1,d4                *d4=end addr
  116.     beq    release_compiler
  117.     move.l    a1,a4                *a4=source addr
  118.  
  119.     move.l    #1,line_number-work(a6)
  120.     move.l    a4,line_ptr-work(a6)
  121.     move.l    a4,line_locate-work(a6)
  122.     moveq.l    #0,d0                *グローバルワーク初期化
  123.     move.l    d0,n_of_err-work(a6)
  124.     move.l    d0,n_of_warn-work(a6)
  125.     move.l    d0,ti_link_offset-work(a6)
  126.     move.l    d0,compile_phase-work(a6)    *compile_phase,compile_status,n_of_track
  127.     move.l    d0,err_stock_addr-work(a6)
  128.     move.l    d0,err_stock_size-work(a6)
  129.     move.l    d0,ptn_addr-work(a6)
  130.     move.l    d0,macro_addr-work(a6)
  131.     move.l    d0,mcrnm_hash_tbl-work(a6)
  132.     move.l    d0,chgsrc_addr-work(a6)
  133.     move.l    d0,now_cmd-work(a6)        *now_cmd,ptn_cmd,adpcm_bank
  134.     move.l    d0,zms_file_id-work(a6)
  135.     move.l    d0,include_depth-work(a6)
  136.     move.l    d0,pmr_addr-work(a6)
  137.     move.w    d0,list_mode-work(a6)        *list_mode,fxgt_mode,v2_compatch,dummy
  138.     btst.l    #12,d1
  139.     beq    @f
  140.     move.b    #1,v2_compatch-work(a6)
  141. @@:
  142.     move.l    #$0000_01_00,step_input-work(a6)    *step_input,assign_done
  143.                             *jump_cmd_ctrl,velo_vol_ctrl
  144.     move.l    #$1016_1016,dev_mdl_ID-work(a6)        *デバイスID,モデルID初期値初期化
  145.     move.w    #$1016,dev_mdl_ID+4-work(a6)
  146.     move.l    #$01_00_08_03,auto_comment-work(a6)    *auto_comment,seq_cmd,gate_range,gate_shift
  147.     move.b    #ZM_COMPILER,zmc_call-work(a6)
  148.     move.l    t_trk_no-work(a6),a0
  149.     move.w    #-1,(a0)
  150.  
  151.     moveq.l    #100,d2                *ファイルネームバッファ確保
  152.     move.l    #ID_TEMP,d3            *filename...(0),
  153.     jsr    get_mem-work(a6)        *インクルードしたファイルの読み込みアドレス
  154.     tst.l    d0                *親ソースの最終ドレス
  155.     bmi    m_out_of_memory            *親ソースのコンパイルアドレス(exit_sec)
  156.     move.l    d2,erfn_size-work(a6)
  157.     move.l    a0,erfn_addr-work(a6)
  158.     clr.l    erfn_now-work(a6)
  159. *    clr.l    erfn_recent0-work(a6)
  160. *    clr.l    erfn_recent1-work(a6)
  161.  
  162.     move.l    #2048,d2            *制御コマンド格納バッファ確保(m_play他)
  163.     move.l    #ID_TEMP,d3
  164.     jsr    get_mem-work(a6)
  165.     tst.l    d0
  166.     bmi    m_out_of_memory
  167.     move.l    a0,ctrl_addr-work(a6)
  168.     move.l    d2,ctrl_size-work(a6)
  169.     add.l    a0,d2
  170.     move.l    d2,ctrl_end-work(a6)
  171.     clr.l    ctrl_now-work(a6)
  172.  
  173.     move.l    #ta_size*100,d2            *トラック番号再割り振り用ワークエリア
  174.     move.l    #ID_TEMP,d3
  175.     jsr    get_mem-work(a6)
  176.     tst.l    d0
  177.     bmi    m_out_of_memory            *type(.l),offset(.l)
  178.     move.l    a0,trkn_addr-work(a6)        *source trk n(.l),destination trk n(.l)
  179.     move.l    d2,trkn_size-work(a6)
  180.     add.l    a0,d2
  181.     move.l    d2,trkn_end-work(a6)
  182.     clr.l    trkn_now-work(a6)
  183.  
  184.     move.w    #16,trk_n_max-work(a6)        *トラック管理テーブル
  185.     move.l    #tpt_tsize*16,d2        *構造はzclabel.macを参照のこと
  186.     move.l    #ID_TEMP,d3            *ID
  187.     jsr    get_mem-work(a6)
  188.     tst.l    d0
  189.     bmi    m_out_of_memory
  190.     move.l    a0,trk_ptr_tbl-work(a6)        *enlarge or get?
  191.  
  192.     move.l    #2048,d2            *トラック情報テーブル用ワークバッファ
  193.     move.l    #ID_TEMP,d3            *ワーク構成(リスト構造)
  194.     jsr    get_mem-work(a6)        *[tr.no]w,[next_tit_offset/0=this is last]l,
  195.     tst.l    d0                *[p_track_stat]b,[p_track_mode]b,
  196.     bmi    m_out_of_memory            *[p_trkfrq]b,[p_trkfrqwk]b,
  197.     move.l    a0,trk_inf_tbl-work(a6)        *[p_type]w,[p_ch]w,
  198.     move.l    d2,tit_size-work(a6)        *[comment length]l
  199.     moveq.l    #0,d0                *[comment.....],0.b
  200.     move.l    d0,tit_now-work(a6)        *[tr.no+1]w.......and so on
  201.     move.w    d0,(a0)                *初期化
  202.  
  203.     move.l    #$1_0000,d2            *デフォルトバッファサイズ=64kb
  204.     move.l    #ID_ZMD,d3            *ここが出力される
  205.     jsr    get_mem-work(a6)
  206.     tst.l    d0
  207.     bmi    m_out_of_memory
  208.     move.l    a0,zmd_addr-work(a6)        *保存
  209.     move.l    d2,zmd_size-work(a6)        *保存
  210.     add.l    a0,d2
  211.     move.l    d2,zmd_end-work(a6)
  212.     clr.l    zmd_now-work(a6)
  213.  
  214.     move.l    #ZmuSiC0,d0            *header
  215.     bsr    do_wrt_cmn_l
  216.     move.l    #ZmuSiC1+v_code,d0
  217.     bsr    do_wrt_cmn_l
  218.  
  219.     moveq.l    #(z_header_size-z_comn_offset)/4-1,d2
  220.     moveq.l    #0,d0
  221. @@:                        *インフォメーションエリアの初期化#1
  222.     bsr    do_wrt_cmn_l
  223.     dbra    d2,@b
  224.     * global    d4:ソースリストの最終アドレス+1
  225.     *        a4:現在走査中のソース
  226. cmpl_lp:
  227.     tst.l    macro_now-work(a6)
  228.     beq    @f
  229.     bsr    consider_macro            *マクロに基づきソース変換
  230. @@:
  231.     move.l    sp,sp_buf-work(a6)        *スタック保存
  232.     move.l    a4,line_ptr-work(a6)
  233.     bsr    skip_spc
  234.     cmp.l    a4,d4
  235.     bls    compile_end    *終了
  236.     tst.b    list_mode-work(a6)        *現在の実行モードが.listか.nlistか
  237.     beq    @f
  238.     lea    list_str-work(a6),a1
  239.     jsr    get_com_no-work(a6)
  240.     smi    list_mode-work(a6)
  241.     bmi    skip_comment
  242.     bra    cmpl_lp
  243. @@:
  244.     bsr    chk_num
  245.     bpl    reg_adpcm_data_by_no    *数値ならばADPCM登録(V2形式)
  246.     moveq.l    #0,d0
  247.     move.b    d0,now_cmd-work(a6)    *初期化
  248.     move.b    (a4)+,d0
  249.     beq    compile_end    *終了
  250.     jsr    chk_kanji-work(a6)
  251.     bpl    @f
  252.                 *全角スキップ
  253.     cmp.l    a4,d4        *1バイト目でファイル終端にきていないかチェック
  254.     bls    m_kanji_break_off
  255.     addq.w    #1,a4        *全角の2バイト目をスキップ
  256.     bra    cmpl_lp
  257. @@:
  258.     cmpi.b    #$0a,d0        *改行
  259.     beq    inc_line
  260.     cmpi.b    #$1a,d0        *ファイル終端
  261.     beq    compile_end    *終了
  262.     cmpi.b    #' ',d0
  263.     bls    cmpl_lp        *SPC以下(spcやtabその他のコントロールコード)なら無視
  264.     cmpi.b    #'#',d0        *#印のコマンド
  265.     beq    shp_com
  266.     cmpi.b    #'.',d0        *#印のコマンド
  267.     beq    shp_com
  268.     cmpi.b    #'/',d0        *コメント行
  269.     beq    skip_comment
  270.     cmpi.b    #'(',d0        *文字列と判断して
  271.     bne    m_syntax_error
  272.                 *case:'('
  273.     bsr    skip_spc
  274.     cmpi.b    #' ',(a4)
  275.     bls    cmpl_lp
  276.     cmp.l    a4,d4
  277.     bls    compile_end
  278.     move.b    (a4)+,d0
  279.     move.l    d0,d1
  280.     jsr    mk_capital-work(a6)
  281.     subi.b    #$41,d0        *ABC..Z→0,1,2,..,25
  282.     bmi    not_alphabet    *case:smaller than 'A'
  283.     cmpi.b    #25,d0
  284.     bhi    not_alphabet    *case:bigger than 'Z'
  285.  
  286.     add.w    d0,d0
  287.     move.w    cmn_j_tbl(pc,d0.w),d0
  288.     jmp    cmn_j_tbl(pc,d0.w)
  289.  
  290. t_undef:    equ    m_syntax_error
  291. cmn_j_tbl:
  292.     dc.w    t_assign-cmn_j_tbl    *a チャンネル/トラック・アサイン
  293.     dc.w    t_bsch-cmn_j_tbl    *b ベースチャンネル設定    (no zmd)
  294.     dc.w    t_cont-cmn_j_tbl    *c    ctrl
  295.     dc.w    t_jump-cmn_j_tbl    *d    no zmd
  296.     dc.w    t_skip-cmn_j_tbl    *e
  297.     dc.w    t_mfader-cmn_j_tbl    *f    ctrl
  298.     dc.w    t_undef-cmn_j_tbl    *g
  299.     dc.w    t_undef-cmn_j_tbl    *h
  300.     dc.w    t_init-cmn_j_tbl    *i
  301.     dc.w    t_undef-cmn_j_tbl    *j
  302.     dc.w    t_undef-cmn_j_tbl    *k
  303.     dc.w    t_undef-cmn_j_tbl    *l
  304.     dc.w    t_skip-cmn_j_tbl    *m    t_alloc
  305.     dc.w    t_undef-cmn_j_tbl    *n
  306.     dc.w    t_tempo-cmn_j_tbl    *o
  307.     dc.w    t_play-cmn_j_tbl    *p    ctrl
  308.     dc.w    t_skip-cmn_j_tbl    *q    t_total
  309.     dc.w    t_skip-cmn_j_tbl    *r    t_rec
  310.     dc.w    t_stop-cmn_j_tbl    *s    ctrl
  311.     dc.w    t_trk-cmn_j_tbl        *t
  312.     dc.w    t_velovol-cmn_j_tbl    *u    no zmd
  313.     dc.w    t_vset-cmn_j_tbl    *v
  314.     dc.w    t_undef-cmn_j_tbl    *w
  315.     dc.w    t_midi_trns-cmn_j_tbl    *x
  316.     dc.w    t_undef-cmn_j_tbl    *y
  317.     dc.w    t_set_mclk-cmn_j_tbl    *z
  318.  
  319. not_alphabet:
  320.     cmpi.b    #'@',d1        *AL/FB分離フォーマット
  321.     beq    t_vset_2
  322.     bra    m_syntax_error
  323.  
  324. inc_line:
  325.     pea    cmpl_lp(pc)
  326. cr_line:
  327.     addq.l    #1,line_number-work(a6)
  328. crl_patch:            *DISPLAY LINE MODEではパッチ(bsr.s disp_line)
  329.     nop
  330.     move.l    a4,line_locate-work(a6)
  331.     move.l    a4,line_ptr-work(a6)
  332.     rts
  333.  
  334. disp_line:
  335.     movem.l    d0/a1,-(sp)
  336.     move.w    #$0d,-(sp)
  337.     DOS    _PUTCHAR
  338.     addq.w    #2,sp
  339.     move.l    line_number-work(a6),d0
  340.     jsr    num_to_str-work(a6)
  341.     lea    suji-work(a6),a1
  342.     jbsr    prta1-work(a6)
  343.     lea    crld_ctr-work(a6),a1
  344.     jsr    prta1-work(a6)
  345.     movem.l    (sp)+,d0/a1
  346.     rts
  347.  
  348. skip_comment:            *case:コメント行(改行を見付けるまでループ)
  349.     pea    cmpl_lp(pc)
  350. do_skip_comment:
  351.     move.w    d0,-(sp)
  352. skcmlp:
  353.     cmp.l    a4,d4
  354.     bls    exit_skcmt    *終了
  355.     move.b    (a4)+,d0
  356.     bsr    chk_kanji    *漢字かどうかチェック
  357.     bpl    @f
  358.     cmp.l    a4,d4
  359.     bls    exit_skcmt    *終了
  360.     move.b    (a4)+,d0
  361.     bra    skcmlp
  362. @@:
  363.     cmpi.b    #$0a,d0        *行終端でコメント終了
  364.     bne    skcmlp
  365.     subq.w    #1,a4
  366. exit_skcmt:
  367.     move.l    a4,line_ptr-work(a6)
  368.     move.w    (sp)+,d0
  369.     rts
  370.  
  371. compile_end:                    *コンパイル終了→ZMD作成
  372.     tst.l    include_depth-work(a6)        *includeしたファイルが
  373.     bne    pop_include_ope            *コンパイル終了したに過ぎない
  374.  
  375.     move.b    compile_status-work(a6),d0    *d7をチェック
  376.     bpl    @f
  377.     btst.l    #6,d0                *d6をチェック
  378.     beq    @f
  379.     clr.l    line_number-work(a6)
  380.     bsr    m_sync_and_jump_control_are_used_at_the_same_time
  381. @@:
  382.     st.b    compile_phase-work(a6)
  383.     tst.l    n_of_err-work(a6)
  384.     bne    @f
  385.     bsr    free_erfn
  386.     bra    _asmhed_cmpled
  387. @@:
  388.     move.l    err_stock_addr-work(a6),d0    *エラーリスト集配処理
  389.     move.l    d0,a2
  390.     move.l    err_stock_size-work(a6),d2
  391.     add.l    a2,d2
  392.     add.l    err_stock_now-work(a6),a2    *a2=実際に使われた終端アドレスに相当する
  393.     move.l    erfn_now-work(a6),d3
  394.     beq    asmhed_cmpled
  395.     move.l    erfn_addr-work(a6),a5        *アドレスリストを作るための先頭アドレス
  396.     move.l    a5,a1
  397.     add.l    a5,d3                *ソースファイルネーム格納領域最終アドレス
  398. asmerfn_lp00:
  399.     move.l    a2,d1                *ファイルネーム格納アドレス
  400.     sub.l    err_stock_addr-work(a6),d1
  401. asmerfn_lp01:
  402.     cmp.l    a2,d2
  403.     bhi    store_asmerfn
  404.     bsr    enlarge_err_stk            *err_stock_addr領域拡大
  405.     bpl    store_asmerfn
  406. @@:                        *エラーケース
  407.     tst.b    (a1)+
  408.     bne    @b
  409.     move.l    a1,d0
  410.     addq.l    #1,d0
  411.     bclr.l    #0,d0
  412.     move.l    d0,a1                *.even
  413.     bra    error_asmerfn
  414. store_asmerfn:
  415.     move.b    (a1)+,(a2)+            *includeしたファイル名のストア
  416.     bne    asmerfn_lp01
  417.     move.l    a1,d0
  418.     addq.l    #1,d0
  419.     bclr.l    #0,d0
  420.     move.l    d0,a1                *.even
  421.  
  422.     move.l    a2,d0
  423.     addq.l    #1,d0
  424.     bclr.l    #0,d0
  425.     move.l    d0,a2                *.even
  426.  
  427.     sub.l    a2,d0
  428.     move.l    d0,(a2)+            *内容のアドレス
  429.  
  430.     move.l    (a1),a3                *読み込んだファイルのアドレス
  431.     move.l    4(a1),d0            *読み込んだファイルの長さ
  432.     beq    aserfn_next
  433. asmerfn_lp02:                    *内容のコピー
  434.     cmp.l    a2,d2
  435.     bhi    @f
  436.     bsr    enlarge_err_stk            *err_stock_addr領域拡大
  437.     bmi    error_asmerfn
  438. @@:
  439.     move.l    (a3)+,(a2)+
  440.     subq.l    #4,d0
  441.     bne    asmerfn_lp02
  442. aserfn_next:
  443.     pea    size_of_isi(a1)
  444.     move.l    (a1),a1
  445.     jsr    free_mem-work(a6)    *解放
  446.     move.l    (sp)+,a1
  447.     move.l    d1,(a5)+
  448.     cmp.l    a1,d3            *すべてのソースファイルネームを集配したか
  449.     bhi    asmerfn_lp00
  450. asmerfn2:                *エラーリストのfilename[n]に実行アドレスをセット
  451.     move.l    err_stock_addr-work(a6),a1
  452.     move.l    a1,d1
  453.     add.l    err_stock_now-work(a6),d1    *最終アドレス
  454.     sub.l    a1,a2            *エラーリスト領域のサイズ
  455.     move.l    a2,err_stock_size-work(a6)
  456.     move.l    erfn_addr-work(a6),a2    *ファイルネームアドレス格納リスト
  457. aserfn2_lp:
  458.     tst.l    (a1)+            *error number
  459.     bpl    @f            *next_aserfn2
  460.     move.l    (a1),d0            *filename[n]
  461.     subq.l    #1,d0
  462.     bcs    @f
  463.     lsl.l    #2,d0
  464.     move.l    (a2,d0.l),d0
  465.     add.l    err_stock_addr-work(a6),d0
  466.     move.l    d0,(a1)            *ファイルネーム格納アドレス設定
  467. @@:
  468.     add.w    #12,a1
  469. next_aserfn2:
  470.     cmp.l    a1,d1
  471.     bhi    aserfn2_lp
  472.  
  473. asmhed_cmpled:                *ヘッダの集配処理
  474.     tst.l    n_of_err-work(a6)    *エラーが有ったか
  475.     bne    compile_err_end        *あった
  476. _asmhed_cmpled:
  477.     move.l    zmd_addr-work(a6),a1
  478.     lea    z_header_size(a1),a2
  479.     cmp.l    a2,a0
  480.     beq    cped_ctrl        *共通コマンドはなし
  481.     move.l    #z_header_size-(z_comn_offset+4),z_comn_offset(a1)
  482.  
  483.     moveq.l    #-1,d0            *set end code
  484.     jsr    do_wrt_zmd_b-work(a6)
  485.     move.l    a0,d0
  486.     andi.b    #1,d0            *even
  487.     beq    cped_ctrl
  488.     moveq.l    #-1,d0            *set end code
  489.     jsr    do_wrt_zmd_b-work(a6)    *even処理ヒットケース
  490. cped_ctrl:                *制御コマンド・アセンブル
  491.     tst.l    ctrl_now-work(a6)
  492.     beq    cped_trkdt        *制御コマンドなかった
  493.     moveq.l    #-1,d0            *set end code
  494.     jsr    do_wrt_ctrl_b-work(a6)
  495.     move.l    zmd_addr-work(a6),a1
  496.     lea    z_ctrl_offset+4(a1),a1
  497.     move.l    ctrl_addr-work(a6),a2
  498.     move.l    a0,d0
  499.     sub.l    a1,d0
  500.     move.l    d0,-(a1)        *制御コマンド部分へのオフセットをセット
  501.  
  502.     move.l    ctrl_now-work(a6),d1
  503.     add.l    a2,d1            *制御コマンド部分転送
  504.     addq.l    #3,d1
  505.     andi.w    #$fffc,d1        *make it long word border
  506.     sub.l    a2,d1            *d1.l=制御コマンド部分size
  507.     add.l    d1,a0
  508.     jsr    chk_membdr_zmd-work(a6)    *バッファが足りなければ拡張する
  509.     sub.l    d1,a0
  510.     move.l    a0,ctrl_now-work(a6)    *TR番号再割り振りの時に使うのでここに格納しておく
  511. @@:
  512.     move.l    (a2)+,(a0)+
  513.     subq.l    #4,d1
  514.     bne    @b
  515. cped_trkdt:
  516.     moveq.l    #0,d1            *d1.l=ダミーサイズ
  517.     moveq.l    #0,d2
  518.     moveq.l    #0,d3
  519.     move.w    n_of_track-work(a6),d0    *演奏データトラック数
  520.     beq    get_zmdsz        *no performance data
  521.     subq.w    #1,d0            *for dbra
  522.     move.l    trk_ptr_tbl-work(a6),a2
  523. cpedlp00:
  524.     move.l    tpt_now(a2),d4        *全トラックの演奏データサイズも加算
  525.     beq    cped_next
  526.     addq.l    #3+1,d4            *+1はエンドコード($ff)分
  527.     andi.w    #$fffc,d4        *make it long word border
  528.     add.l    d4,d1            *全トラックの演奏データサイズも加算
  529.     bcs    m_illegal_track_size    *over flow
  530.                     *トラック番号再割り振り処理
  531.     move.l    trkn_now-work(a6),d4
  532.     beq    cped00
  533.     move.l    trkn_addr-work(a6),a1
  534. cpedlp01:
  535.     tst.l    tpt_trkno(a2)
  536.     bmi    @f
  537.     move.l    tpt_trkno(a2),a3
  538.     cmp.l    ta_trk_n(a1),a3        *目的のトラック番号か調べる
  539.     bne    @f
  540.     tst.l    ta_type(a1)
  541.     bne    1f
  542.                     *MML系
  543.     move.l    trk_ptr_tbl-work(a6),a3
  544.     add.l    ta_tpt_n(a1),a3
  545.     move.l    tpt_addr(a3),a3
  546.     add.l    ta_offset(a1),a3
  547.     bra    2f
  548. 1:                    *CTRL系
  549.     move.l    ctrl_now-work(a6),a3
  550.     add.l    ta_offset(a1),a3
  551. 2:
  552.     move.l    #-1,ta_trk_n(a1)    *done mark
  553.     ror.w    #8,d3
  554.     move.b    d3,(a3)+
  555.     ror.w    #8,d3
  556.     move.b    d3,(a3)+
  557. @@:
  558.     add.w    #ta_size,a1
  559.     sub.l    #ta_size,d4
  560.     bne    cpedlp01
  561. cped00:
  562.     addq.w    #1,d3
  563. cped_next:
  564.     lea    tpt_tsize(a2),a2
  565.     dbra    d0,cpedlp00
  566.     tst.l    d3            *有効トラックがない
  567.     beq    get_zmdsz
  568.  
  569.     move.l    zmd_addr-work(a6),a1
  570.     lea    z_trk_offset+4(a1),a1
  571.     move.l    a0,d0
  572.     sub.l    a1,d0
  573.     move.l    d0,-(a1)        *トラック情報テーブル部分へのオフセットをセット
  574.  
  575.     move.l    d3,d0
  576.     subq.w    #1,d0
  577.     jsr    do_wrt_zmd_w-work(a6)    *総トラック数
  578.     move.l    d3,d2
  579.     lsl.l    #ti_size_,d2        *トラック情報テーブルが占有するサイズを予め計算
  580.     add.l    d2,d1
  581.     move.l    d3,d0
  582.     addq.l    #2,d1            *DUMMY '//' SIZE 97/06/24
  583.     lsl.l    #tx_size_,d0        *トラック追加情報が占有するサイズを予め計算
  584.     add.l    d0,d1            *これを加算
  585.  
  586.     move.l    trk_inf_tbl-work(a6),a1    *トラックコメントのサイズも加算
  587.     move.l    d3,d0
  588.     subq.w    #1,d0            *for dbra
  589.     move.l    trk_ptr_tbl-work(a6),a2
  590. addticmlp:
  591.     move.l    tpt_now(a2),d4        *全トラックの演奏データサイズも加算
  592.     bne    1f
  593.     addq.w    #1,d0            *減算無効化
  594.     bra    2f
  595. 1:
  596.     move.l    tit_cmt_len(a1),d4
  597.     addq.l    #3,d4
  598.     andi.w    #$fffc,d4        *make it long word border
  599.     add.l    d4,d1
  600.     bcs    m_illegal_track_size    *over flow
  601. 2:
  602.     addq.w    #tit_next,a1
  603.     add.l    (a1)+,a1
  604.     lea    tpt_tsize(a2),a2
  605.     dbra    d0,addticmlp
  606. get_zmdsz:
  607.     move.l    zmd_addr-work(a6),a1
  608.     lea    (a0,d1.l),a2
  609.     suba.l    a1,a2            *a2.l=ZMD本体のサイズ
  610.     move.l    a2,z_zmd_size(a1)    *ZMDのサイズを格納
  611.  
  612.     add.l    err_stock_size-work(a6),d1    *ウォーニングコードテーブルサイズ分
  613.     addq.l    #4,d1            *ウォーニング数格納領域分
  614.     add.l    d1,a0            *予め使用するメモリ量を計算して確保
  615.     jsr    fix_zmd_size-work(a6)    *ZMDサイズ確定
  616.     sub.l    d1,a0            *a0.l=トラック情報テーブルの書き込み先アドレス
  617.     move.w    n_of_track-work(a6),d3
  618.     beq    mk_wn_tbl        *トラック数ゼロの場合
  619.     subq.w    #1,d3            *for dbra
  620.     lea    2(a0,d2.l),a1        *a1.l=トラックデータの書き込み先アドレス
  621.     move.l    trk_inf_tbl-work(a6),a2
  622.     move.l    trk_ptr_tbl-work(a6),a4
  623. asm_zmd_lp:                *演奏データのアセンブル
  624.     move.l    tpt_now(a4),d4        *サイズ(do_copy_dataで使用)
  625.     beq    asm_zmd_next        *空ならば次へ
  626.     move.l    tit_stat_mode(a2),(a0)+    *ti_track_stat,ti_track_mode,ti_trkfrq,ti_trkfrqwk
  627.     move.l    tit_type_ch(a2),(a0)+    *ti_type,ti_ch
  628.     addq.w    #4,a0
  629.     move.l    a1,d0
  630.     add.l    #tx_size,d0
  631.     move.l    tit_cmt_len(a2),d1    *コメントサイズ
  632.     move.l    d1,d2
  633.     addq.l    #3,d2
  634.     andi.w    #$fffc,d2        *convert it into long word border
  635.     add.l    d2,d0
  636.     move.l    d0,a5            *演奏データが格納されるべきアドレス
  637.     sub.l    a0,d0
  638.     move.l    d0,-4(a0)        *演奏データまでのオフセットをセット
  639.     addq.w    #4,a0
  640.     move.l    a1,d0
  641.     sub.l    a0,d0
  642.     move.l    d0,-4(a0)        *トラック追加情報までのオフセットをセット
  643.     move.w    #'//',(a0)        *97/06/24
  644.  
  645.     clr.l    (a1)+            *total_step
  646.     clr.l    (a1)+            *checksum
  647.     clr.l    (a1)+            *n_of_measure
  648.     move.l    d1,(a1)+        *comment length
  649.     beq    do_copy_play_data    *トラックコメント無し
  650.     lea    tit_comment(a2),a3
  651. @@:                    *トラックコメント転送
  652.     move.l    (a3)+,(a1)+
  653.     subq.l    #4,d2
  654.     bne    @b
  655. do_copy_play_data:            *演奏データの転送
  656.     move.l    a5,a1
  657.     move.l    tpt_addr(a4),a3        *演奏データの格納アドレス
  658.     add.l    d4,a5
  659.     addq.l    #3+1,d4            *+1はend code分
  660.     andi.w    #$fffc,d4        *make it long word border
  661. @@:
  662.     move.l    (a3)+,(a1)+        *転送
  663.     subq.l    #4,d4
  664.     bne    @b
  665. @@:
  666.     st.b    (a5)+            *play_end_zmdを終端にセット
  667.     cmp.l    a5,a1
  668.     bne    @b
  669. asm_zmd_next:
  670.     addq.w    #tit_next,a2
  671.     add.l    (a2)+,a2
  672.     lea    tpt_tsize(a4),a4
  673.     dbra    d3,asm_zmd_lp
  674. mk_wn_tbl:
  675.     move.l    zmd_addr-work(a6),a1
  676.     add.l    z_zmd_size(a1),a1
  677.     move.l    n_of_warn-work(a6),(a1)+    *ウォーニングコードの数
  678.     move.l    err_stock_addr-work(a6),a2
  679.     move.l    err_stock_size-work(a6),d2
  680.     beq    free_mmwk
  681. @@:                    *ウォーニングコードテーブル転送
  682.     move.l    (a2)+,(a1)+
  683.     subq.l    #4,d2
  684.     bne    @b
  685. free_mmwk:                *ワーク解放
  686.     bsr    free_work_area        *ワークエリア解放
  687.     move.l    err_stock_addr-work(a6),d0
  688.     beq    @f
  689.     move.l    d0,a1
  690.     jsr    free_mem-work(a6)    *エラー(ウォーニング)コードテーブル解放
  691. @@:
  692.     move.l    zmd_addr-work(a6),a0    *data addr
  693.     tst.l    z_trk_offset(a0)    *演奏データがあるならばデフォルトパラメータを設定する
  694.     beq    exit_cmpled
  695.     tst.w    z_tempo(a0)
  696.     bne    exit_cmpled
  697.     move.w    #120,z_tempo(a0)
  698. exit_cmpled:
  699.     moveq.l    #0,d0                *no error mark
  700.     rts
  701.  
  702. free_erfn:                    *erfn_addr中のバッファを解放
  703. reglist    reg    d0/d3/a0-a1
  704.     movem.l    reglist,-(sp)
  705.     move.l    erfn_now-work(a6),d3
  706.     beq    exit_free_erfn
  707.     move.l    erfn_addr-work(a6),a0
  708.     add.l    a0,d3
  709. @@:                    *ファイル名文字列スキップ
  710.     tst.b    (a0)+
  711.     bne    @b
  712.     move.l    a0,d0
  713.     addq.l    #1,d0
  714.     bclr.l    #0,d0
  715.     move.l    d0,a0            *even
  716.     move.l    (a0),a1
  717.     add.l    err_stock_addr-work(a6),a1
  718.     pea    size_of_isi(a0)
  719.     jsr    free_mem
  720.     move.l    (sp)+,a0
  721.     cmp.l    a0,d3            *すべてのソースファイルネームを集配したか
  722.     bhi    @b
  723. exit_free_erfn:
  724.     movem.l    (sp)+,reglist
  725.     rts
  726.  
  727. error_asmerfn:                    *エラーケース
  728.     move.l    a1,a2
  729. errasmerfnlp:
  730.     move.l    (a2),a1
  731.     jsr    free_mem-work(a6)
  732.     add.l    #size_of_isi,a2
  733.     cmp.l    a2,d3                *すべてのソースファイルネームを集配したか
  734.     bls    exit_errasmerfnlp
  735. @@:                        *filename skip
  736.     tst.b    (a2)+
  737.     bne    @b
  738.     move.l    a2,d0
  739.     addq.l    #1,d0
  740.     bclr.l    #0,d0
  741.     move.l    d0,a2                *.even
  742.     bra    errasmerfnlp
  743. exit_errasmerfnlp:
  744.     move.l    #1,n_of_err-work(a6)
  745.     clr.l    n_of_warn-work(a6)
  746.     move.l    err_stock_addr-work(a6),a1
  747.     move.l    #ZM_COMPILER*65536+OUT_OF_MEMORY,(a1)
  748. compile_err_end:            *エラー終了
  749.     bsr    free_work_area        *ワークエリア解放
  750.     suba.l    a0,a0            *a0=0
  751.     move.l    n_of_err-work(a6),d0    *ウォーニングの数とエラーの数を合計して
  752.     add.l    n_of_warn-work(a6),d0    *持って帰る
  753.     tst.w    compile_option+2-work(a6)    *エラーテーブル作成要求有るか
  754.     bpl    @f
  755.     move.l    err_stock_addr-work(a6),a0
  756. @@:
  757.     rts
  758.  
  759. free_work_area:
  760.     * x d3,a1,a2
  761.     bsr    free_erfn
  762.  
  763.     move.l    erfn_addr-work(a6),a1
  764.     jsr    free_mem-work(a6)
  765.  
  766.     move.l    ctrl_addr-work(a6),a1    *制御コマンドバッファ解放
  767.     jsr    free_mem-work(a6)
  768.  
  769.     move.l    trkn_addr-work(a6),a1    *トラック番号再割り振り用ワーク解放
  770.     jsr    free_mem-work(a6)
  771.  
  772.     move.l    trk_inf_tbl-work(a6),a1    *トラック情報テーブル解放
  773.     jsr    free_mem-work(a6)
  774.  
  775.     move.l    mcrnm_hash_tbl-work(a6),d0    *ハッシュテーブル解放
  776.     beq    @f
  777.     move.l    d0,a1
  778.     jsr    free_mem-work(a6)
  779. @@:
  780.     move.l    ptn_addr-work(a6),d0    *パターントラック管理テーブル解放
  781.     beq    @f
  782.     move.l    d0,a1
  783.     jsr    free_mem-work(a6)
  784. @@:
  785.     move.l    macro_addr-work(a6),d0    *マクロ文字列バッファ解放
  786.     beq    @f
  787.     move.l    d0,a1
  788.     jsr    free_mem-work(a6)
  789. @@:
  790.     move.l    pmr_addr-work(a6),d0    *マクロ変換情報バッファ解放
  791.     beq    @f
  792.     move.l    d0,a1
  793.     jsr    free_mem-work(a6)
  794. @@:
  795.     move.l    chgsrc_addr-work(a6),d0    *変換ソースバッファ解放
  796.     beq    @f
  797.     move.l    d0,a1
  798.     jsr    free_mem-work(a6)
  799. @@:
  800.     move.l    trk_ptr_tbl-work(a6),a2    *トラックバッファ管理テーブル解放
  801.     move.w    n_of_track-work(a6),d3
  802.     beq    free_tpt
  803.     subq.w    #1,d3            *for dbra
  804. fwalp0:
  805.     move.l    tpt_addr(a2),a1        *トラックバッファ解放
  806.     jsr    free_mem-work(a6)
  807.     move.l    tpt_rept_addr(a2),d0    *繰り返しコマンドワーク解放
  808.     beq    @f
  809.     move.l    d0,a1
  810.     jsr    free_mem-work(a6)
  811. @@:
  812.     move.l    tpt_sgcd_addr(a2),d0    *反復記号コマンドワーク解放
  813.     beq    @f
  814.     move.l    d0,a1
  815.     jsr    free_mem-work(a6)
  816. @@:
  817.     move.l    tpt_fgmap_addr(a2),d0    *反復記号フラグワークマップ解放
  818.     beq    @f
  819.     move.l    d0,a1
  820.     jsr    free_mem-work(a6)
  821. @@:
  822.     move.l    tpt_renp_addr(a2),d0
  823.     beq    @f
  824.     move.l    d0,a1
  825.     jsr    free_mem-work(a6)
  826. @@:
  827.     lea    tpt_tsize(a2),a2
  828.     dbra    d3,fwalp0
  829. free_tpt:
  830.     move.l    trk_ptr_tbl-work(a6),a1    *トラックバッファ管理テーブル解放
  831.     jsr    free_mem-work(a6)
  832.     clr.l    trk_ptr_tbl-work(a6)    *初期化
  833.     rts
  834.  
  835. enlarge_err_stk:                *err_stock_addr領域拡大
  836.     * < a2.l=now address
  837.     * > a2.l=new address
  838.     * > d2.l=new end address
  839.     * > eq:no error
  840.     * > mi:error
  841.     movem.l    d0-d1/d3/a0-a1,-(sp)
  842.     move.l    err_stock_addr-work(a6),a1
  843.     move.l    a2,d1
  844.     sub.l    a1,d1
  845.     move.l    d1,d2
  846.     add.l    #65536,d2            *64kbバイト拡張
  847.     move.l    d2,err_stock_size-work(a6)
  848.     jsr    enlarge_mem-work(a6)
  849.     tst.l    d0
  850.     bmi    @f                *メモリ不足
  851.     lea    (a0,d1.l),a2
  852.     move.l    a0,err_stock_addr-work(a6)
  853.     move.l    err_stock_size-work(a6),d2
  854.     add.l    a0,d2
  855.     moveq.l    #0,d0
  856. @@:
  857.     movem.l    (sp)+,d0-d1/d3/a0-a1
  858.     rts
  859. *-----------------------------------------------------------------------------
  860. release_compiler:            *コンパイラの解放処理
  861.     lea    work,a6            *わざと
  862.     move.l    a0work-work(a6),d0
  863.     beq    rc_release_err0
  864.  
  865.     moveq.l    #-1,d1
  866.     Z_MUSIC    #ZM_OCCUPY_COMPILER    *コンパイラが占有されているか
  867.     tst.l    d0
  868.     bne    rc_release_err1        *されてた
  869.  
  870.     suba.l    a1,a1            *a1.l=0
  871.     move.l    rel_cmplr_mark-work(a6),d1
  872.     Z_MUSIC    #ZM_APPLICATION_RELEASER    *解放ルーチン登録取消
  873.     move.l    a0,d0
  874.     beq    rc_release_err0
  875.  
  876.     moveq.l    #ZM_COMPILER,d1
  877.     suba.l    a1,a1            *vacant mark
  878.     Z_MUSIC    #ZM_HOOK_FNC_SERVICE
  879.  
  880.     moveq.l    #ZM_OCCUPY_COMPILER,d1
  881.     suba.l    a1,a1            *vacant mark
  882.     Z_MUSIC    #ZM_HOOK_FNC_SERVICE
  883.  
  884.     moveq.l    #ZM_CALC_TOTAL,d1
  885.     suba.l    a1,a1            *vacant mark
  886.     Z_MUSIC    #ZM_HOOK_FNC_SERVICE
  887.  
  888.     move.l    zmc_work-work(a6),-(sp)
  889.     DOS    _MFREE
  890.     addq.w    #4,sp
  891.  
  892.     bsr    kill_ZMC        *デバイス名をシステムワークより除去
  893.     bmi    rc_release_err0
  894.  
  895.     lea    kaijo-work(a6),a1
  896.     move.l    a0work-work(a6),a0
  897.     moveq.l    #0,d0            *no error
  898. bye_rlscmplr:
  899.     tst.b    errmes_lang-work(a6)    *0:英語か 1:日本語か
  900.     beq    exit_rlscmplr
  901. @@:                    *次のメッセージをゲット
  902.     tst.b    (a1)+
  903.     bne    @b
  904. exit_rlscmplr:
  905.     rts
  906.  
  907. rc_release_err0:            *解除不能
  908.     lea    kaijo_er-work(a6),a1
  909.     suba.l    a0,a0
  910.     moveq.l    #-1,d0            *error
  911.     bra    bye_rlscmplr
  912.  
  913. rc_release_err1:            *占有されている
  914.     lea    kaijo_er-work(a6),a1
  915.     suba.l    a0,a0
  916.     moveq.l    #1,d0            *error
  917.     bra    bye_rlscmplr
  918.  
  919. kill_ZMC:                *デバイス名の除去
  920.     * > eq=no error
  921.     * > mi=error
  922.     lea    $6800,a0        *デバイス名”OPM”を強制的に削除する
  923. KO_lp01:
  924.     lea    NUL-work(a6),a2
  925.     bsr    do_find
  926.     cmpa.l    a2,a0
  927.     bcc    KO_err
  928.     cmpi.w    #$8024,-18(a0)        *本当にNULか
  929.     bne    KO_lp01
  930.  
  931.     lea    -22(a0),a1
  932.     move.l    a1,nul_address-work(a6)
  933.  
  934.     lea    dev_name0(pc),a2
  935.     bsr    rmk_heap        *ヒープ調査(return:a1,a0)
  936.     bmi    KO_err
  937.     move.l    device_driver0(pc),(a0)    *ヒープを再構成して自分は抜ける
  938.  
  939.     moveq.l    #0,d0
  940.     rts
  941. KO_err:
  942.     moveq.l    #-1,d0
  943.     rts
  944.  
  945. do_find:            *特定のデバイス名を探し出す
  946.     move.b    (a2),d0
  947. dfn_lp01:            *一文字目が見付かるまでループ
  948.     cmp.b    (a0)+,d0
  949.     bne    dfn_lp01
  950.  
  951.     move.l    a0,d0        *save a0 to d0
  952.     lea    1(a2),a1
  953.     moveq.l    #7-1,d1
  954. dfn_lp02:
  955.     cmpm.b    (a0)+,(a1)+
  956.     bne    next_dfn
  957.     dbra    d1,dfn_lp02
  958.     rts
  959. next_dfn:
  960.     movea.l    d0,a0        *get back a0
  961.     bra    do_find
  962.  
  963. rmk_heap:
  964.     * < a1.l=NUL
  965.     * < a2.l=抜けたいデバイス名
  966.     * > a0.l=探し出したデバイス名のアドレスの1つ前のデバイスのアドレス
  967.     * d0,a0,a1,a2
  968.     lea    -14(a2),a3
  969. KO_lp02:
  970.     bsr    same_dev?
  971.     bne    @f
  972.     cmp.l    a1,a3
  973.     bne    @f
  974.     moveq.l    #0,d0        *Hit!
  975.     rts
  976. @@:
  977.     cmpi.l    #-1,(a1)    *最後尾に来てしまったか
  978.     beq    err_KO
  979.     movea.l    a1,a0        *一つ前のをキープ(戻り値になる)
  980.     move.l    (a1),a1        *次へ
  981.     bra    KO_lp02
  982. err_KO:
  983.     moveq.l    #-1,d0
  984.     rts
  985.  
  986. same_dev?:            *同じ名前かどうか
  987.     * < a2.l=source name
  988.     * > mi=not same
  989.     * > eq=same
  990.     movem.l    a1-a2,-(sp)
  991.     lea    14(a1),a1
  992.     moveq.l    #8-1,d1
  993. @@:
  994.     cmpm.b    (a1)+,(a2)+
  995.     bne    @f
  996.     dbra    d1,@b
  997.     moveq.l    #0,d0
  998.     movem.l    (sp)+,a1-a2
  999.     rts
  1000. @@:
  1001.     moveq.l    #-1,d0
  1002.     movem.l    (sp)+,a1-a2
  1003.     rts
  1004.  
  1005.  
  1006. t_skip:            *閉じ括弧を見つけるまでループ(V2コマンドをエラー出力なしでスキップ)
  1007. tskplp:
  1008.     cmp.l    a4,d4
  1009.     bls    m_illegal_command_line
  1010.     move.b    (a4)+,d0
  1011.     cmpi.b    #$0a,d0
  1012.     bne    @f
  1013.     bsr    cr_line
  1014.     bra    tskplp
  1015. @@:
  1016.     cmpi.b    #')',d0
  1017.     bne    tskplp
  1018.     bra    cmpl_lp        *恐らく次は$0a
  1019.  
  1020. find_end:            *終端 ')' '}' を見付ける処理
  1021.     bsr    skip_spc
  1022.     moveq.l    #')',d0
  1023.     tst.b    now_cmd-work(a6)
  1024.     bpl    @f
  1025.     moveq.l    #'}',d0
  1026. @@:
  1027.     cmp.l    a4,d4
  1028.     bls    m_illegal_command_line
  1029.     cmp.b    (a4)+,d0
  1030.     bne    m_illegal_command_line
  1031.     bra    cmpl_lp
  1032.  
  1033. shp_com:                *#コマンド系(.コマンド系)
  1034.     bsr    skip_spc
  1035.     cmp.l    a4,d4
  1036.     bls    m_command_line_break_off
  1037.     cmpi.b    #'!',(a4)
  1038.     beq    skip_comment        *#!はコメント
  1039.     lea    shp_com_tbl-work(a6),a1
  1040.     bsr    get_com_no
  1041.     bmi    m_syntax_error        *そのようなコマンドはない
  1042.     cmpi.b    #(sc_jmp_tbl-scjt_comment)/2,d0            *comment文のケース
  1043.     beq    @f
  1044.     bsr    skip_spc        *skip separater(パラメータ無しのコマンドもあるから)
  1045.     bra    set_kkt
  1046. @@:                    *(tst.l    d4はやらない)
  1047.     bsr    skip_spc1        *skip separater
  1048. set_kkt:
  1049.     tas.b    now_cmd-work(a6)
  1050.     add.w    d0,d0
  1051.     add.w    d0,d0
  1052.     move.l    sc_jmp_tbl(pc,d0.w),d0
  1053.     jmp    sc_jmp_tbl(pc,d0.l)
  1054.  
  1055. sc_jmp_tbl:                    *#コマンドのジャンプテーブル
  1056.     dc.l    reg_16bitpcm_timbre-sc_jmp_tbl
  1057.     dc.l    reg_16bitpcm_tone-sc_jmp_tbl
  1058.     dc.l    reg_8bitpcm_timbre-sc_jmp_tbl
  1059.     dc.l    reg_8bitpcm_tone-sc_jmp_tbl
  1060.     dc.l    set_adpcm_bank-sc_jmp_tbl
  1061.     dc.l    adpcm_block_data-sc_jmp_tbl
  1062.     dc.l    adpcm_list-sc_jmp_tbl
  1063.     dc.l    reg_adpcm_timbre-sc_jmp_tbl
  1064.     dc.l    reg_adpcm_tone-sc_jmp_tbl
  1065.     dc.l    pcm_tune_setup-sc_jmp_tbl
  1066.     dc.l    assign-sc_jmp_tbl
  1067.     dc.l    adpcm_list-sc_jmp_tbl
  1068.     dc.l    call-sc_jmp_tbl
  1069. scjt_comment:    dc.l    comment-sc_jmp_tbl
  1070.     dc.l    continue-sc_jmp_tbl
  1071.     dc.l    current_midi_in-sc_jmp_tbl
  1072.     dc.l    current_midi_out-sc_jmp_tbl
  1073.     dc.l    define-sc_jmp_tbl
  1074.     dc.l    dummy-sc_jmp_tbl
  1075.     dc.l    erase_tone-sc_jmp_tbl
  1076.     dc.l    erase_timbre-sc_jmp_tbl
  1077.     dc.l    erase-sc_jmp_tbl
  1078.     dc.l    exclusive-sc_jmp_tbl
  1079.     dc.l    fixed_gatetime-sc_jmp_tbl
  1080.     dc.l    fm_master_volume-sc_jmp_tbl
  1081.     dc.l    fm_vset-sc_jmp_tbl
  1082.     dc.l    fm_tune_setup-sc_jmp_tbl
  1083.     dc.l    fm_vset-sc_jmp_tbl
  1084.     dc.l    gatetime_resolution-sc_jmp_tbl
  1085.     dc.l    gm_system_on-sc_jmp_tbl
  1086.     dc.l    gs_chorus-sc_jmp_tbl
  1087.     dc.l    gs_display-sc_jmp_tbl
  1088.     dc.l    gs_drum_setup-sc_jmp_tbl
  1089.     dc.l    gs_drum_setup-sc_jmp_tbl
  1090.     dc.l    gs_drum_name-sc_jmp_tbl
  1091.     dc.l    gs_reset-sc_jmp_tbl
  1092.     dc.l    gs_partial_reserve-sc_jmp_tbl
  1093.     dc.l    gs_part_setup-sc_jmp_tbl
  1094.     dc.l    gs_part_setup-sc_jmp_tbl
  1095.     dc.l    gs_print-sc_jmp_tbl
  1096.     dc.l    gs_reset-sc_jmp_tbl
  1097.     dc.l    gs_reverb-sc_jmp_tbl
  1098.     dc.l    gs_partial_reserve-sc_jmp_tbl
  1099.     dc.l    halt-sc_jmp_tbl
  1100.     dc.l    include_file-sc_jmp_tbl
  1101.     dc.l    initialize-sc_jmp_tbl
  1102.     dc.l    curb_jump-sc_jmp_tbl
  1103.     dc.l    key-sc_jmp_tbl
  1104.     dc.l    length_mode-sc_jmp_tbl
  1105.     dc.l    list-sc_jmp_tbl
  1106.     dc.l    m1_effect_setup-sc_jmp_tbl
  1107.     dc.l    m1_setup-sc_jmp_tbl
  1108.     dc.l    m1_part_setup-sc_jmp_tbl
  1109.     dc.l    m1_print-sc_jmp_tbl
  1110.     dc.l    m1_setup-sc_jmp_tbl
  1111.     dc.l    master_clock_cmd-sc_jmp_tbl
  1112.     dc.l    master_fader-sc_jmp_tbl
  1113.     dc.l    meter-sc_jmp_tbl
  1114.     dc.l    midi_data-sc_jmp_tbl
  1115.     dc.l    midi_dump-sc_jmp_tbl
  1116.     dc.l    mt32_common-sc_jmp_tbl
  1117.     dc.l    mt32_drum_setup-sc_jmp_tbl
  1118.     dc.l    mt32_reset-sc_jmp_tbl
  1119.     dc.l    mt32_partial_reserve-sc_jmp_tbl
  1120.     dc.l    mt32_partial-sc_jmp_tbl
  1121.     dc.l    mt32_part_setup-sc_jmp_tbl
  1122.     dc.l    mt32_patch-sc_jmp_tbl
  1123.     dc.l    mt32_partial_reserve-sc_jmp_tbl
  1124.     dc.l    mt32_print-sc_jmp_tbl
  1125.     dc.l    mt32_reset-sc_jmp_tbl
  1126.     dc.l    mt32_reverb-sc_jmp_tbl
  1127.     dc.l    mt32_drum_setup-sc_jmp_tbl
  1128.     dc.l    nlist-sc_jmp_tbl
  1129.     dc.l    reg_adpcm_data_by_kc-sc_jmp_tbl
  1130.     dc.l    pattern-sc_jmp_tbl
  1131.     dc.l    pcm_tune_setup-sc_jmp_tbl
  1132.     dc.l    performance_time-sc_jmp_tbl
  1133.     dc.l    play-sc_jmp_tbl
  1134.     dc.l    print-sc_jmp_tbl
  1135.     dc.l    relative_velocity-sc_jmp_tbl
  1136.     dc.l    roland_exclusive-sc_jmp_tbl
  1137.     dc.l    gs_chorus-sc_jmp_tbl
  1138.     dc.l    gs_display-sc_jmp_tbl
  1139.     dc.l    gs_drum_setup-sc_jmp_tbl
  1140.     dc.l    gs_drum_setup-sc_jmp_tbl
  1141.     dc.l    gs_drum_name-sc_jmp_tbl
  1142.     dc.l    gs_reset-sc_jmp_tbl
  1143.     dc.l    gs_partial_reserve-sc_jmp_tbl
  1144.     dc.l    gs_part_setup-sc_jmp_tbl
  1145.     dc.l    gs_part_setup-sc_jmp_tbl
  1146.     dc.l    gs_print-sc_jmp_tbl
  1147.     dc.l    gs_reverb-sc_jmp_tbl
  1148.     dc.l    gs_reset-sc_jmp_tbl
  1149.     dc.l    gs_partial_reserve-sc_jmp_tbl
  1150.     dc.l    sc88_mode-sc_jmp_tbl
  1151.     dc.l    sc88_mode-sc_jmp_tbl
  1152.     dc.l    sc88_reverb-sc_jmp_tbl
  1153.     dc.l    sc88_chorus-sc_jmp_tbl
  1154.     dc.l    sc88_delay-sc_jmp_tbl
  1155.     dc.l    sc88_equalizer-sc_jmp_tbl
  1156.     dc.l    sc88_part_setup-sc_jmp_tbl
  1157.     dc.l    sc88_part_setup-sc_jmp_tbl
  1158.     dc.l    sc88_drum_setup-sc_jmp_tbl
  1159.     dc.l    sc88_drum_setup-sc_jmp_tbl
  1160.     dc.l    sc88_drum_name-sc_jmp_tbl
  1161.     dc.l    sc88_user_inst-sc_jmp_tbl
  1162.     dc.l    sc88_user_drum-sc_jmp_tbl
  1163.     dc.l    send_to_m1-sc_jmp_tbl
  1164.     dc.l    midi_dump-sc_jmp_tbl
  1165.     dc.l    stop-sc_jmp_tbl
  1166.     dc.l    tempo-sc_jmp_tbl
  1167.     dc.l    track_fader-sc_jmp_tbl
  1168.     dc.l    track_mask-sc_jmp_tbl
  1169.     dc.l    track-sc_jmp_tbl
  1170.     dc.l    u220_common-sc_jmp_tbl
  1171.     dc.l    u220_drum_inst-sc_jmp_tbl
  1172.     dc.l    u220_drum_setup-sc_jmp_tbl
  1173.     dc.l    u220_part_setup-sc_jmp_tbl
  1174.     dc.l    u220_print-sc_jmp_tbl
  1175.     dc.l    u220_setup-sc_jmp_tbl
  1176.     dc.l    u220_timbre-sc_jmp_tbl
  1177.     dc.l    wave_form-sc_jmp_tbl
  1178.     dc.l    wave_form-sc_jmp_tbl
  1179.     dc.l    yamaha_exclusive-sc_jmp_tbl
  1180.     dc.l    yamaha_exclusive-sc_jmp_tbl
  1181.     dc.l    zpd_equ-sc_jmp_tbl
  1182. sc_jmp_tbl_end:
  1183.  
  1184. assign:                    *トラック・アサイン(.assign)
  1185. *    jsr    check_relation_cmn-work(a6)    *コマンド関係チェック
  1186.     clr.l    assign_bracket-work(a6)
  1187.     bsr    get_asgn_trk        *トラック番号取りだし
  1188.     bsr    skip_sep
  1189.     bsr    skip_eq
  1190.     cmp.l    a4,d4
  1191.     bls    @f
  1192.     cmpi.b    #'{',(a4)
  1193.     bne    @f
  1194.     addq.w    #1,a4        *skip '{'
  1195.     move.l    #' { }',assign_bracket-work(a6)
  1196. @@:
  1197.     bsr    get_asgn_ch        *チャンネル番号取りだし
  1198. go_assign:
  1199.     bsr    check_trchrng        *トラック-チャンネル整合性チェック
  1200.     lea    line_backup-work(a6),a2
  1201.     move.l    line_number-work(a6),(a2)+
  1202.     move.l    line_locate-work(a6),(a2)+
  1203.     move.l    line_ptr-work(a6),(a2)+
  1204.     move.l    n_of_err-work(a6),(a2)+
  1205. gaslp00:
  1206.     movem.l    d4/a4,-(sp)
  1207.     move.l    asgn_trk_s-work(a6),d5
  1208.     move.l    asgn_ch_s-work(a6),d2
  1209.     bsr    do_assign        *実際のアサイン処理へ
  1210.     move.l    asgn_trk_s-work(a6),d0
  1211.     cmp.l    asgn_trk_e-work(a6),d0
  1212.     beq    exit_asgn
  1213.     move.l    n_of_err-work(a6),d0
  1214.     cmp.l    line_backup+12-work(a6),d0
  1215.     bne    exit_asgn        *エラーが発生している
  1216.     movem.l    (sp)+,d4/a4
  1217.     move.l    line_backup+8-work(a6),line_ptr-work(a6)
  1218.     move.l    line_backup+4-work(a6),line_locate-work(a6)
  1219.     move.l    line_backup+0-work(a6),line_number-work(a6)
  1220.  
  1221.     move.l    asgn_trk_s-work(a6),d0
  1222.     cmp.l    asgn_trk_e-work(a6),d0
  1223.     bcs    @f
  1224.     subq.l    #1,asgn_trk_s-work(a6)
  1225.     bra    1f
  1226. @@:
  1227.     addq.l    #1,asgn_trk_s-work(a6)
  1228. 1:
  1229.     move.l    asgn_ch_s-work(a6),d0
  1230.     cmp.l    asgn_ch_e-work(a6),d0
  1231.     bcs    @f
  1232.     subq.l    #1,asgn_ch_s-work(a6)
  1233.     bra    gaslp00
  1234. @@:
  1235.     addq.l    #1,asgn_ch_s-work(a6)
  1236.     bra    gaslp00
  1237. exit_asgn:
  1238.     addq.w    #8,sp            *movem.l d4/a4,-(sp)を無効に
  1239.     tst.l    assign_bracket-work(a6)
  1240.     beq    cmpl_lp
  1241.     bra    find_end
  1242.  
  1243. t_assign:            *チャンネル・アサイン(Ach,tr)
  1244. *    jsr    check_relation_cmn-work(a6)    *コマンド関係チェック
  1245.     move.l    #' ( )',assign_bracket-work(a6)
  1246.     bsr    get_asgn_ch
  1247.     bsr    skip_sep
  1248.     bsr    get_asgn_trk
  1249.     bra    go_assign
  1250.  
  1251. get_asgn_trk:                *トラック番号取得
  1252.     * x d1
  1253.     bsr    chk_num
  1254.     bpl    @f
  1255.     bsr    srch_num        *TRnなどの接頭文字列をスキップする
  1256.     bmi    m_assign_command_error
  1257. @@:
  1258.     bsr    get_num            *TR番号取りだし(ただし65535はパターントラック専用番号)
  1259.     subq.l    #1,d1
  1260.     cmpi.l    #tr_max-1,d1
  1261.     bhi    m_illegal_track_number
  1262.     move.l    d1,asgn_trk_s-work(a6)
  1263.     move.l    d1,asgn_trk_e-work(a6)
  1264.     bsr    chk_num
  1265.     bmi    @f
  1266.     bsr    get_num            *TR1-2のようなケースに対応
  1267.     neg.l    d1
  1268.     bmi    m_illegal_track_number
  1269.     subq.l    #1,d1
  1270.     cmpi.l    #tr_max-1,d1
  1271.     bhi    m_illegal_track_number
  1272.     move.l    d1,asgn_trk_e-work(a6)
  1273. @@:
  1274.     rts
  1275.  
  1276. get_asgn_ch:            *チャンネル取得
  1277.     * x a1,d1-d2
  1278.     bsr    chk_num        *数値指定か文字指定か
  1279.     bmi    1f
  1280.                 *数値指定(V2互換考慮)
  1281.     bsr    get_num
  1282.     subq.l    #1,d1
  1283.     cmpi.l    #31,d1
  1284.     bhi    m_illegal_channel
  1285.     lsl.w    #2,d1
  1286.     lea    real_ch_tbl-work(a6),a1
  1287.     move.l    (a1,d1.w),d2
  1288.     move.l    d2,asgn_ch_s-work(a6)
  1289.     move.l    d2,asgn_ch_e-work(a6)
  1290.     bsr    chk_num
  1291.     bmi    2f
  1292.     bsr    get_num        *FM1-2のようなケースに対応
  1293.     neg.l    d1
  1294.     bmi    m_illegal_channel
  1295.     subq.l    #1,d1
  1296.     cmpi.l    #31,d1
  1297.     bhi    m_illegal_channel
  1298.     lsl.w    #2,d1
  1299.     lea    real_ch_tbl-work(a6),a1
  1300.     move.l    (a1,d1.w),asgn_ch_e-work(a6)
  1301.     bra    2f
  1302. 1:                *文字列指定ケース
  1303.     bsr    get_str_ch    *> d2=type,ch
  1304.     bne    m_error_code_exit
  1305.     move.l    d2,asgn_ch_s-work(a6)
  1306.     move.l    d2,asgn_ch_e-work(a6)
  1307.     bsr    chk_num
  1308.     bmi    2f
  1309.     bsr    get_num        *FM1-2のようなケースに対応
  1310.     neg.l    d1
  1311.     bmi    m_illegal_channel
  1312.     subq.l    #1,d1
  1313.     move.w    d1,d2
  1314.     move.l    d2,asgn_ch_e-work(a6)
  1315.     swap    d2
  1316.     tst.w    d2        *チャンネル番号の正当性チェック
  1317.     bne    1f
  1318.     cmpi.l    #8-1,d1        *FM
  1319.     bhi    m_illegal_channel
  1320.     bra    2f
  1321. 1:
  1322.     cmpi.l    #16-1,d1    *MIDI&ADPCM
  1323.     bhi    m_illegal_channel
  1324. 2:
  1325.     rts
  1326.  
  1327. check_trchrng:            *整合性チェック
  1328.     move.l    asgn_trk_e-work(a6),d0
  1329.     move.l    asgn_trk_s-work(a6),d1
  1330.     cmp.l    d1,d0
  1331.     bcc    @f
  1332.     exg.l    d0,d1
  1333. @@:
  1334.     sub.l    d1,d0        *d0.l=変化幅
  1335.     move.l    d0,-(sp)
  1336.  
  1337.     move.l    asgn_ch_e-work(a6),d0
  1338.     move.l    asgn_ch_s-work(a6),d1
  1339.     cmp.l    d1,d0
  1340.     bcc    @f
  1341.     exg.l    d0,d1
  1342. @@:
  1343.     sub.l    d1,d0        *d0.l=変化幅
  1344.     cmp.l    (sp)+,d0
  1345.     bne    m_assign_command_error    *チャンネルとトラックの変化幅が合わない
  1346.     rts
  1347.  
  1348. do_assign:                *トラック/チャンネルアサイン
  1349.     * < d2=ch,d5=tr
  1350.     move.l    #$0080_0000,d6        *trk vol=128,trk freq=0(means 1)
  1351.     moveq.l    #0,d1            *stat,mode,frq,frqwk=0
  1352.     tst.l    assign_bracket-work(a6)
  1353.     beq    check_reasgn
  1354.                     *trk vol
  1355.     bsr    skip_sep
  1356.     bsr    chk_num            *もう数値はない
  1357.     bmi    @f
  1358.     bsr    get_num            *トラック音量値取りだし
  1359.     cmpi.l    #1024,d1
  1360.     bhi    m_illegal_track_volume
  1361.     move.l    d1,d6
  1362.     swap    d6
  1363. @@:                    *trk freq.
  1364.     moveq.l    #0,d1            *d1=default
  1365.     bsr    skip_sep
  1366.     bsr    chk_num            *もう数値はない
  1367.     bmi    @f
  1368.     bsr    get_num            *割り込み頻度値取りだし
  1369.     subq.l    #1,d1
  1370.     cmpi.l    #255,d1
  1371.     bhi    m_illegal_track_frequency
  1372.     move.w    d1,d6
  1373.     lsl.w    #8,d1
  1374. @@:
  1375.     bsr    skip_sep        *skip ,
  1376.     * < d1=frquency,d2=ch,d5=tr
  1377.     lea    track_stat_cmdln-work(a6),a1
  1378.     bsr    get_com_no        *get track stat > (0/1)
  1379.     bpl    @f
  1380.     moveq.l    #0,d0            *default
  1381. @@:
  1382.     swap    d1
  1383.     move.w    d0,d1
  1384.     beq    @f
  1385.     move.w    #$80+ID_REC,d1
  1386. @@:
  1387.     bsr    skip_sep        *skip ,
  1388.     lea    track_mode_cmdln-work(a6),a1
  1389.     bsr    get_com_no        *get track mode > (0/1)
  1390.     bpl    @f
  1391.     moveq.l    #0,d0            *default
  1392. @@:
  1393.     tst.l    d0
  1394.     beq    @f
  1395.     moveq.l    #$80,d0            *no key off
  1396. @@:
  1397.     lsl.w    #8,d1
  1398.     move.b    d0,d1
  1399.     swap    d1            *stat,mode,frq,frqwk
  1400. check_reasgn:
  1401.     move.l    trk_inf_tbl-work(a6),a1
  1402.     move.l    ti_link_offset-work(a6),d0    *リンク・オフセット=0の時は
  1403.     beq    new_gtr_fst        *だぶりチェック省略
  1404.     move.l    d0,a2
  1405. @@:
  1406.     cmp.w    (a1)+,d5        *既に登録済み
  1407.     beq    m_reassignment_error
  1408.     move.l    (a1)+,d0
  1409.     beq    new_gtr            *新規に登録
  1410.     add.l    d0,a1
  1411.     bra    @b
  1412. new_gtr:                *2回目以降の登録
  1413.     move.l    tit_now-work(a6),d0
  1414.     sub.l    a2,d0
  1415.     add.l    trk_inf_tbl-work(a6),a2
  1416.     move.l    d0,-(a2)        *set link offset
  1417. new_gtr_fst:                *1回目の登録(link処理無し)
  1418.     move.w    d5,d0
  1419.     jsr    set_tit_w-work(a6)    *register trk no.
  1420.     addq.w    #1,n_of_track-work(a6)    *トラック数増加
  1421.     beq    m_too_many_tracks    *オーバーフロー(トラック数が多すぎる)
  1422.     moveq.l    #0,d0
  1423.     jsr    set_tit_l-work(a6)    *4bytes reserving for offset space
  1424.     move.l    tit_now-work(a6),ti_link_offset-work(a6)    *keep
  1425.     move.l    d1,d0
  1426.     jsr    set_tit_l-work(a6)    *stat,mode,frq,frqwk
  1427.     move.l    d2,d0
  1428.     jsr    set_tit_l-work(a6)    *p_type,p_ch
  1429.     moveq.l    #0,d0
  1430.     jsr    set_tit_l-work(a6)    *4bytes reserving for string length
  1431.  
  1432.     move.l    assign_bracket-work(a6),d1    *終端文字パターン
  1433.     beq    mark_usedev        *{}パターンではない
  1434.     bsr    skip_sep
  1435.     cmp.l    a4,d4
  1436.     bls    m_illegal_command_line
  1437.     cmp.b    (a4),d1            *コメントがあるか
  1438.     beq    mark_usedev        *no
  1439.     move.l    tit_now-work(a6),a5    *keep
  1440.     moveq.l    #0,d2            *ネスト構造考慮
  1441.     moveq.l    #0,d3            *文字列カウンタ
  1442. ngflp:                    *文字列取得
  1443.     move.b    (a4)+,d0
  1444.     bsr    chk_kanji        *漢字かどうかチェック
  1445.     bpl    @f
  1446.     jsr    set_tit-work(a6)
  1447.     addq.l    #1,d3            *inc str length
  1448.     cmp.l    a4,d4
  1449.     bls    m_string_break_off
  1450.     move.b    (a4)+,d0
  1451.     bra    ngflp_next
  1452. @@:
  1453.     swap    d1
  1454.     cmp.b    d1,d0            *{}のネストも考慮する
  1455.     bne    @f
  1456.     addq.l    #1,d2
  1457. @@:
  1458.     swap    d1
  1459.     cmp.b    d1,d0            *}が有って文字列終わった
  1460.     bne    @f
  1461.     subq.l    #1,d2
  1462.     bcs    1f            *終わり
  1463. @@:
  1464.     cmp.b    #$0a,d0
  1465.     bne    ngflp_next
  1466.     bsr    cr_line            *改行
  1467. ngflp_next:
  1468.     jsr    set_tit-work(a6)
  1469.     addq.l    #1,d3            *inc str length
  1470.     cmp.l    a4,d4
  1471.     bhi    ngflp
  1472.     cmp.l    #$0000_000a,d1
  1473.     bne    m_string_break_off
  1474. 1:
  1475.     subq.w    #1,a4            *終端文字')','}'までポインタを戻す
  1476.     moveq.l    #0,d0            *str end code
  1477.     jsr    set_tit-work(a6)
  1478.     btst.b    #0,tit_now+3-work(a6)    *オフセットポインタの最下位ビットを検査
  1479.     beq    @f
  1480.     moveq.l    #0,d0            *str end code(.even)
  1481.     jsr    set_tit-work(a6)
  1482. @@:
  1483.     add.l    trk_inf_tbl-work(a6),a5
  1484.     move.l    d3,-(a5)        *set string length
  1485. *- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  1486. mark_usedev:
  1487.     * < d2.l=type,ch        *使用したデバイスのマーキング
  1488.     * x d0,a1
  1489.     move.l    zmd_addr-work(a6),a1
  1490.     move.l    d2,d0
  1491.     swap    d0
  1492.     tst.w    d0
  1493.     bmi    mkudv_md
  1494.     bne    mkudv_ad
  1495. *mkudv_fm:            *FM
  1496.     addq.b    #1,z_nof_fm_ch(a1)
  1497.     bra    dotrkalc
  1498. mkudv_ad:            *ADPCM
  1499.     addq.b    #1,z_nof_ad_ch(a1)
  1500.     bra    dotrkalc
  1501. mkudv_md:            *MIDI
  1502.     andi.w    #$7fff,d0    *d0=midi if no.(0-2)
  1503.     cmpi.w    #$7fff,d0
  1504.     bne    @f
  1505.     moveq.l    #0,d0
  1506. @@:
  1507.     addq.b    #1,z_nof_md1_ch(a1,d0.w)
  1508. dotrkalc:
  1509.  
  1510. alloc_trk_buf:                *トラックバッファの確保
  1511.     * < d5.l=trk number(0-65534,65535)
  1512.     * < d6.w=track frequency(0-255)
  1513.     * - all
  1514. reglist    reg    d0-d3/a0-a2/a5
  1515.     movem.l    reglist,-(sp)
  1516.     moveq.l    #0,d1
  1517.     move.w    n_of_track-work(a6),d1
  1518.     cmp.w    trk_n_max-work(a6),d1
  1519.     bcs    do_scr_tbf        *トラックバッファ確保処理へ
  1520.     movem.l    d0-d2/a0-a1,-(sp)    *トラックバッファ管理テーブルの更新/追加登録
  1521.     andi.l    #$ffff,d1
  1522.     addq.l    #8,d1            *上限を増やす
  1523.     cmpi.l    #tr_max,d1
  1524.     bls    @f
  1525.     move.l    #tr_max,d1
  1526. @@:
  1527.     move.l    d1,d2
  1528.     mulu    #tpt_tsize,d2
  1529.     move.l    trk_ptr_tbl-work(a6),a1
  1530.     jsr    enlarge_mem-work(a6)
  1531.     tst.l    d0
  1532.     bmi    m_out_of_memory
  1533. @@:
  1534.     move.l    a0,trk_ptr_tbl-work(a6)
  1535.     move.w    d1,trk_n_max-work(a6)
  1536.     movem.l    (sp)+,d0-d2/a0-a1
  1537. do_scr_tbf:                *トラックバッファの確保
  1538.     subq.l    #1,d1
  1539.     mulu    #tpt_tsize,d1
  1540.     move.l    trk_ptr_tbl-work(a6),a2
  1541.     add.l    d1,a2
  1542.     move.l    #10240,d2        *1トラック当たりのデフォルトトラックバッファサイズ
  1543.     move.l    #ID_TEMP,d3
  1544.     jsr    get_mem-work(a6)
  1545.     tst.l    d0
  1546.     bmi    m_out_of_memory
  1547.     move.l    a2,a5
  1548.     move.l    d5,(a2)+        *trk number
  1549.     move.l    a0,(a2)+        *addr
  1550.     move.l    d2,(a2)+        *size
  1551.     clr.l    (a2)+            *ptr
  1552.     move.l    d6,(a2)+        *tpt_trkvol,tpt_trkfrq
  1553.     bsr    init_compile_work
  1554.     movem.l    (sp)+,reglist
  1555.     rts
  1556.  
  1557. init_compile_work:            *コンパイルワークの初期化
  1558.     * < a5.l=trk N compile work addr
  1559.     * - all
  1560. reglist    reg    d0-d1/a1
  1561.     movem.l    reglist,-(sp)
  1562.     moveq.l    #0,d0
  1563.     move.l    d0,tpt_mode_flg(a5)
  1564.     move.l    d0,tpt_key_sig+0(a5)    *tpt_key_sig+0,1,2,3
  1565.     move.l    d0,tpt_key_sig+4(a5)    *tpt_key_sig+4,5,6,dummy
  1566.     move.l    d0,tpt_velo_n(a5)    *tpt_velo_n,tpt_n_of_velo
  1567.     move.l    d0,tpt_velo_n_chd(a5)    *tpt_velo_n_chd,tpt_n_of_velo_chd
  1568.     move.l    d0,tpt_chord_dly(a5)    *tpt_chord_dly,tpt_echo_dly
  1569.     move.l    d0,tpt_rept_max(a5)
  1570.     move.l    d0,tpt_sgcd_max(a5)
  1571.     move.l    d0,tpt_fgmap_max(a5)
  1572.     move.l    d0,tpt_rept_addr(a5)
  1573.     move.l    d0,tpt_sgcd_addr(a5)
  1574.     move.l    d0,tpt_fgmap_addr(a5)
  1575.     move.l    d0,tpt_renp_addr(a5)
  1576.     move.l    d0,tpt_port_dly(a5)    *tpt_port_dly,tpt_port_hold
  1577.     move.l    #$00_00_00_ff,tpt_echo_loop(a5)    *tpt_echo_loop,tpt_echo_switch,tpt_echo_vdec
  1578.     move.l    #-1,tpt_note_buf(a5)
  1579.  
  1580.     move.l    zmd_addr-work(a6),a1
  1581.     move.w    z_master_clock(a1),d0
  1582.     bne    @f
  1583.     move.w    #192,d0
  1584.     move.w    d0,z_master_clock(a1)
  1585. @@:
  1586.     lsr.w    #2,d0
  1587.     move.w    d0,tpt_note_len(a5)        *Lコマンドのデフォルト値
  1588.     move.b    gate_range-work(a6),d0
  1589.     move.w    d0,tpt_gate_time(a5)        *Qコマンドのデフォルト値
  1590.     move.l    #$05_7f_01_01,tpt_octave(a5)    *tpt_octave,tpt_last_velo,
  1591.                         *tpt_rltv_velo,tpt_rltv_vol
  1592.     move.l    #$80808080,d0            *ベロシティシーケンス初期化
  1593.     moveq.l    #(velo_max/4)-1,d1
  1594.     lea    tpt_velo(a5),a1
  1595. @@:
  1596.     move.l    d0,(a1)+
  1597.     dbra    d1,@b
  1598.  
  1599.     lea    tpt_velo_chd(a5),a1        *和音ベロシティシーケンス初期化
  1600.     moveq.l    #16/4-1,d1
  1601. @@:
  1602.     move.l    d0,(a1)+
  1603.     dbra    d1,@b
  1604.     bsr    init_tptnttbl
  1605.     movem.l    (sp)+,reglist
  1606.     rts
  1607.  
  1608. get_str_ch:                *文字でチャンネルアサイン
  1609.     * < (a4)=str addr.
  1610.     * > (a4)=next
  1611.     * > d2.l=typ,ch value
  1612.     * > d0.l=err result(z:no err)
  1613.     * x d1
  1614.     moveq.l    #0,d1
  1615.     bsr    skip_spc
  1616.     cmp.l    a4,d4
  1617.     bls    exit_err_gsc0    *m_assign error
  1618.     move.b    (a4)+,d0
  1619.     jsr    mk_capital-work(a6)
  1620.     cmpi.b    #'F',d0
  1621.     beq    gsc_case_fm
  1622.     cmpi.b    #'A',d0
  1623.     beq    gsc_case_ad
  1624.     cmpi.b    #'P',d0
  1625.     bne    gsc_case_md
  1626. gsc_case_ad:            *ADPCM
  1627.     bsr    srch_num
  1628.     bmi    @f
  1629.     bsr    get_num
  1630.     subq.l    #1,d1
  1631.     cmpi.l    #15,d1
  1632.     bhi    exit_err_gsc1
  1633.     bra    gsc00
  1634. @@:                *チャンネル番号省略ケース
  1635.     move.b    adpcm_default_ch-work(a6),d1
  1636.     addq.b    #1,adpcm_default_ch-work(a6)
  1637. gsc00:
  1638.     moveq.l    #1,d2
  1639.     swap    d2
  1640.     move.w    d1,d2
  1641.     moveq.l    #0,d0        *no err
  1642.     rts
  1643. gsc_case_fm:            *FM
  1644.     bsr    srch_num
  1645.     bmi    exit_err_gsc1    *illegal ch
  1646.     bsr    get_num
  1647.     subq.l    #1,d1
  1648.     cmpi.l    #7,d1
  1649.     bhi    exit_err_gsc1
  1650.     move.l    d1,d2
  1651.     moveq.l    #0,d0        *no err
  1652.     rts
  1653. gsc_case_md:
  1654.     move.l    #-1,d2        *default type(-1 means current)
  1655.     cmpi.b    #'M',d0
  1656.     bne    exit_err_gsc2    *?? device error
  1657.     bsr    srch_num
  1658.     bmi    exit_err_gsc1    *illegal ch
  1659.     bsr    get_num
  1660.     bsr    skip_spc
  1661.     cmp.l    a4,d4
  1662.     bls    exit_err_gsc0    *m_assign error
  1663.     move.b    (a4),d0        *前のパラメータがインターフェース番号で
  1664.     cmpi.b    #':',d0        *今度の数値がチャンネル番号?
  1665.     beq    @f
  1666.     cmpi.b    #'-',d0
  1667.     bne    mdch_chk_gsc
  1668. @@:                *get ch num
  1669.     addq.w    #1,a4
  1670.     bsr    chk_num
  1671.     bmi    exit_err_gsc1
  1672.     move.l    d1,d2        *save I/F to d2
  1673.     bsr    get_num        *get ch no.(有効範囲は後でチェック
  1674.     subq.l    #1,d2
  1675.     cmpi.l    #if_max-1,d2
  1676.     bhi    exit_err_gsc2    *illegal_interface_number
  1677.     ori.w    #$8000,d2
  1678.     swap    d2
  1679. mdch_chk_gsc:
  1680.     subq.l    #1,d1
  1681.     cmpi.l    #15,d1
  1682.     bhi    exit_err_gsc1    *illegal ch
  1683.     move.w    d1,d2
  1684.     moveq.l    #0,d0
  1685.     rts
  1686. exit_err_gsc0:            *m_assign error
  1687.     move.l    #ZM_COMPILER*65536+ASSIGN_COMMAND_ERROR,d0
  1688.     rts
  1689. exit_err_gsc1:            *illegal ch
  1690.     move.l    #ZM_COMPILER*65536+ILLEGAL_CHANNEL,d0
  1691.     rts
  1692. exit_err_gsc2:            *illegal interface number
  1693.     move.l    #ZM_COMPILER*65536+ILLEGAL_INTERFACE_NUMBER,d0
  1694.     rts
  1695.  
  1696. srch_num:            *数字までスキップ
  1697.     * X d0
  1698.     move.w    d0,-(sp)
  1699. srch_num_lp:
  1700.     cmp.l    a4,d4
  1701.     bls    @f        *コマンドの途中でファイルの最後に来た
  1702.     move.b    (a4)+,d0
  1703. *    tst.b    now_cmd-work(a6)
  1704. *    bpl    @f
  1705.     cmpi.b    #'{',d0
  1706.     beq    sn_err        *コマンドの途中で改行
  1707.     cmpi.b    #'}',d0
  1708.     beq    sn_err
  1709. *    bra    snchk_cmma
  1710. *@@:
  1711.     cmpi.b    #'(',d0
  1712.     beq    sn_err
  1713.     cmpi.b    #')',d0
  1714.     beq    sn_err
  1715. snchk_cmma:
  1716.     cmpi.b    #',',d0
  1717.     beq    sn_err
  1718.     cmpi.b    #'$',d0
  1719.     beq    its_num
  1720.     cmpi.b    #'%',d0
  1721.     beq    its_num
  1722.     cmpi.b    #'0',d0
  1723.     bcs    srch_num_lp
  1724.     cmpi.b    #'9',d0
  1725.     bhi    srch_num_lp
  1726. its_num:
  1727.     subq.w    #1,a4
  1728.     move.w    (sp)+,d0
  1729.     move.w    #CCR_ZERO,ccr
  1730.     rts
  1731. sn_err:
  1732.     subq.w    #1,a4
  1733. @@:
  1734.     move.w    (sp)+,d0
  1735.     move.w    #CCR_NEGA,ccr
  1736.     rts
  1737.  
  1738. t_bsch:                *ベースチャンネル切り換え
  1739.     tst.b    assign_done-work(a6)
  1740.     bne    m_illegal_command_order        *コマンドの順番がまずい
  1741. *    jsr    check_relation_cmn-work(a6)    *コマンド関係チェック
  1742.     moveq.l    #0,d1
  1743.     bsr    chk_num        *(b)だけの時はFM基準
  1744.     bmi    @f
  1745.     bsr    get_num
  1746. @@:
  1747.     lea    real_ch_tbl-work(a6),a1
  1748.     tst.l    d1
  1749.     beq    fmbs_mode    *FMチャンネルベースモード
  1750.                 *MIDIチャンネルベースモード
  1751.     move.l    #$8000_0000,d0
  1752.     moveq.l    #16-1,d1
  1753. @@:
  1754.     move.l    d0,(a1)+
  1755.     addq.w    #1,d0
  1756.     dbra    d1,@b
  1757.  
  1758.     moveq.l    #0,d0
  1759.     moveq.l    #8-1,d1
  1760. @@:
  1761.     move.l    d0,(a1)+
  1762.     addq.w    #1,d0
  1763.     dbra    d1,@b
  1764.  
  1765.     move.l    #$0001_0000,d0
  1766.     moveq.l    #8-1,d1
  1767. @@:
  1768.     move.l    d0,(a1)+
  1769.     addq.w    #1,d0
  1770.     dbra    d1,@b
  1771.     bra    find_end
  1772. fmbs_mode:
  1773.     moveq.l    #0,d0
  1774.     moveq.l    #8-1,d1
  1775. @@:
  1776.     move.l    d0,(a1)+
  1777.     addq.w    #1,d0
  1778.     dbra    d1,@b
  1779.  
  1780.     move.l    #$0001_0000,(a1)+    *ADPCM1
  1781.  
  1782.     move.l    #$8000_0000,d0
  1783.     moveq.l    #16-1,d1
  1784. @@:
  1785.     move.l    d0,(a1)+
  1786.     addq.w    #1,d0
  1787.     dbra    d1,@b
  1788.  
  1789.     move.l    #$0001_0001,d0        *ADPCM2-8
  1790.     moveq.l    #7-1,d1
  1791. @@:
  1792.     move.l    d0,(a1)+
  1793.     addq.w    #1,d0
  1794.     dbra    d1,@b
  1795.     bra    find_end
  1796.  
  1797. continue:                    *.CONTINUE
  1798. *    jsr    check_relation_cmn-work(a6)    *コマンド関係チェック
  1799.     moveq.l    #0,d3
  1800.     bsr    chk_num
  1801.     bpl    @f
  1802.     bsr    skip_eq
  1803.     cmp.l    a4,d4
  1804.     bls    @f
  1805.     cmpi.b    #'{',(a4)
  1806.     bne    @f
  1807.     moveq.l    #-1,d3
  1808.     addq.w    #1,a4            *skip '{'
  1809.     bra    @f
  1810. t_cont:                    *演奏継続(C)
  1811. *    jsr    check_relation_cmn-work(a6)    *コマンド関係チェック
  1812.     moveq.l    #-1,d3
  1813. @@:
  1814.     moveq.l    #CTRL_CONT,d0    *コマンドコード
  1815.     bsr    getset_trk_seq    *トラックパラメータをセット
  1816.     move.l    zmd_addr-work(a6),a1
  1817.     move.l    z_ctrl_flag(a1),d0
  1818.     bset.l    #CTRL_CONT/4,d0
  1819.     move.l    d0,z_ctrl_flag(a1)
  1820.     tst.b    d3
  1821.     bne    find_end
  1822.     bra    cmpl_lp
  1823.  
  1824. curb_jump:                    *.JUMP
  1825.     tst.b    assign_done-work(a6)
  1826.     bne    m_illegal_command_order        *コマンドの順番がまずい
  1827. *    jsr    check_relation_cmn-work(a6)    *コマンド関係チェック
  1828.     bsr    skip_eq
  1829.     moveq.l    #0,d3
  1830.     cmp.l    a4,d4
  1831.     bls    m_parameter_cannot_be_omitted
  1832.     cmp.l    #'{',(a4)
  1833.     bne    @f
  1834.     moveq.l    #-1,d3
  1835.     addq.w    #1,a4            *skip '{'
  1836. @@:
  1837.     lea    en_ds_tbl-work(a6),a1
  1838.     bsr    get_com_no
  1839.     bmi    m_undefined_mode
  1840.     move.b    d0,jump_cmd_ctrl-work(a6)
  1841.     tst.b    d3
  1842.     bne    find_end
  1843.     bra    cmpl_lp
  1844.  
  1845. t_jump:                        *[!]コマンドの有効/無効化スイッチ
  1846.     tst.b    assign_done-work(a6)
  1847.     bne    m_illegal_command_order        *コマンドの順番がまずい
  1848. *    jsr    check_relation_cmn-work(a6)    *コマンド関係チェック
  1849.     bsr    chk_num
  1850.     bpl    @f
  1851.     not.b    jump_cmd_ctrl-work(a6)
  1852.     bra    find_end
  1853. @@:
  1854.     bsr    get_num
  1855.     tst.l    d1
  1856.     sne    jump_cmd_ctrl-work(a6)
  1857.     bra    find_end
  1858.  
  1859. play:                        *.PLAY
  1860. *    jsr    check_relation_cmn-work(a6)    *コマンド関係チェック
  1861.     moveq.l    #0,d3
  1862.     bsr    chk_num
  1863.     bpl    @f
  1864.     bsr    skip_eq
  1865.     cmp.l    a4,d4                *.playだけの時は無視する
  1866.     bls    cmpl_lp
  1867.     cmpi.b    #'{',(a4)
  1868.     bne    @f
  1869.     bsr    skip_spc
  1870.     cmp.l    a4,d4
  1871.     bls    m_illegal_command_line
  1872.     cmpi.b    #'}',(a4)
  1873.     beq    find_end            *(p)だけの時は無視する
  1874.     moveq.l    #-1,d3
  1875.     addq.w    #1,a4                *skip '{'
  1876.     bra    @f
  1877. t_play:                        *演奏開始(P)
  1878. *    jsr    check_relation_cmn-work(a6)    *コマンド関係チェック
  1879.     bsr    skip_spc
  1880.     cmp.l    a4,d4
  1881.     bls    m_illegal_command_line
  1882.     cmpi.b    #')',(a4)
  1883.     beq    find_end            *(p)だけの時は無視する
  1884.     moveq.l    #-1,d3
  1885. @@:
  1886.     moveq.l    #CTRL_PLAY,d0    *コマンドコード
  1887.     bsr    getset_trk_seq    *トラックパラメータをセット
  1888.     move.l    zmd_addr-work(a6),a1
  1889.     move.l    z_ctrl_flag(a1),d0
  1890.     bset.l    #CTRL_PLAY/4,d0
  1891.     move.l    d0,z_ctrl_flag(a1)
  1892.     tst.b    d3
  1893.     bne    find_end
  1894.     bra    cmpl_lp
  1895.  
  1896. stop:                        *.STOP
  1897. *    jsr    check_relation_cmn-work(a6)    *コマンド関係チェック
  1898.     moveq.l    #0,d3
  1899.     bsr    chk_num
  1900.     bpl    @f
  1901.     bsr    skip_eq
  1902.     cmpi.b    #'{',(a4)
  1903.     bne    @f
  1904.     moveq.l    #-1,d3
  1905.     addq.w    #1,a4            *skip '{'
  1906.     bra    @f
  1907. t_stop:                    *演奏停止(C)
  1908. *    bsr    check_relation_cmn    *コマンド関係チェック
  1909.     moveq.l    #-1,d3
  1910. @@:
  1911.     moveq.l    #CTRL_STOP,d0        *コマンドコード
  1912.     bsr    getset_trk_seq        *トラックパラメータをセット
  1913.     move.l    zmd_addr-work(a6),a1
  1914.     move.l    z_ctrl_flag(a1),d0
  1915.     bset.l    #CTRL_STOP/4,d0
  1916.     move.l    d0,z_ctrl_flag(a1)
  1917.     tst.b    d3
  1918.     bne    find_end
  1919.     bra    cmpl_lp
  1920.  
  1921. getset_trk_seq:                    *トラック番号をパラメータにしている制御コマンドの書き込み
  1922.     * < d0.w=ctrl command code
  1923.     * x d0,d1,d2
  1924.     jsr    do_wrt_ctrl_w-work(a6)        *write cmd code
  1925. gtslp00:
  1926.     cmp.l    a4,d4
  1927.     bls    exit_gts
  1928.     bsr    chk_num
  1929.     bmi    exit_gts
  1930.     bsr    get_num
  1931.     move.l    d1,d2
  1932.     subq.l    #1,d2
  1933.     cmpi.l    #tr_max-1,d2
  1934.     bhi    m_illegal_track_number        *illegal track number
  1935.     move.l    d2,d1
  1936.     bsr    chk_num
  1937.     bmi    gtslp01
  1938.     bsr    get_num
  1939.     neg.l    d1
  1940.     bmi    m_illegal_track_number        *illegal track number
  1941.     subq.l    #1,d1
  1942.     cmpi.l    #tr_max-1,d1
  1943.     bhi    m_illegal_track_number        *illegal track number
  1944. gtslp01:
  1945.     movem.l    d1-d2,-(sp)
  1946.     move.l    d2,d1
  1947.     jsr    check_trk_no-work(a6)
  1948.     move.l    d1,d0
  1949.     jsr    reg_trkn_ctrl-work(a6)
  1950.     jsr    do_wrt_ctrl_w-work(a6)
  1951.     movem.l    (sp)+,d1-d2
  1952.     cmp.l    d1,d2
  1953.     beq    1f
  1954.     bhi    @f
  1955.     addq.l    #1,d2
  1956.     bra    gtslp01
  1957. @@:
  1958.     subq.l    #1,d2
  1959.     bra    gtslp01
  1960. 1:
  1961.     bsr    skip_sep
  1962.     bra    gtslp00
  1963. exit_gts:
  1964.     moveq.l    #-1,d0                *end code
  1965.     jmp    do_wrt_ctrl_w-work(a6)
  1966.  
  1967. t_mfader:                *(Fn)(マスターフェーダー)
  1968. *    bsr    check_relation_cmn    *コマンド関係チェック
  1969.     moveq.l    #CTRL_MFADER,d0        *コマンドコード
  1970.     jsr    do_wrt_ctrl_w-work(a6)
  1971.     moveq.l    #-1,d0            *ALL DEVICES TO BE CONTROLLED
  1972.     jsr    do_wrt_ctrl_w-work(a6)
  1973.     moveq.l    #-1,d3            *goto find end mark
  1974.     bsr    chk_num
  1975.     bmi    mfade_all
  1976.     bsr    get_num
  1977.     move.l    #$0000_0080,d2        *start.h,end.l
  1978.     tst.l    d1            *check speed
  1979.     bne    @f
  1980.     move.l    #$0080_0080,d2        *解除ケース
  1981.     bra    setmfdrspd
  1982. @@:
  1983.     bpl    @f
  1984.     neg.l    d1
  1985.     swap    d2
  1986. @@:
  1987.     cmpi.l    #fader_spd_max,d1
  1988.     bhi    m_illegal_speed_value
  1989. setmfdrspd:
  1990.     moveq.l    #%0000_0111,d0
  1991.     jsr    do_wrt_ctrl_b-work(a6)    *omt
  1992.     move.l    d1,d0
  1993.     jsr    do_wrt_ctrl_w-work(a6)    *speed
  1994.     move.w    d2,d0
  1995.     jsr    do_wrt_ctrl_b-work(a6)    *start level
  1996.     swap    d2
  1997.     move.w    d2,d0
  1998.     jsr    do_wrt_ctrl_b-work(a6)    *end level
  1999.     bra    exit_mstrfdr
  2000.  
  2001. master_fader:                *.MASTER_FADER
  2002. *    bsr    check_relation_cmn    *コマンド関係チェック
  2003.     moveq.l    #0,d3            *end mark flag
  2004.     bsr    skip_eq
  2005.     cmp.l    a4,d4
  2006.     bls    mfade_all
  2007.     cmpi.b    #'{',(a4)
  2008.     bne    @f
  2009.     moveq.l    #-1,d3            *end mark flag
  2010.     addq.w    #1,a4            *skip '{'
  2011. @@:
  2012.     bsr    skip_spc
  2013.     tst.l    d3
  2014.     beq    @f
  2015.     cmp.l    a4,d4
  2016.     bls    m_illegal_command_line
  2017.     cmpi.b    #'}',(a4)
  2018.     beq    mfade_all
  2019. @@:
  2020.     cmp.l    a4,d4
  2021.     bls    mfade_all
  2022. mstfdrlp:
  2023.     bsr    skip_spc
  2024.     lea    mstrfadr_dev-work(a6),a1    *デバイス名テーブル
  2025.     bsr    get_com_no            *> d0
  2026.     bmi    exit_mstrfdr
  2027.     subq.l    #1,d0
  2028.     bcs    setmstrfdrdev
  2029.     add.w    d0,d0
  2030.     move.w    mstrfdrdvid(pc,d0.w),d0
  2031. setmstrfdrdev:
  2032.     move.w    d0,d2
  2033.     moveq.l    #CTRL_MFADER,d0        *コマンドコード
  2034.     jsr    do_wrt_ctrl_w-work(a6)
  2035.     move.w    d2,d0
  2036.     jsr    do_wrt_ctrl_w-work(a6)
  2037.     bsr    get_spd_str_end            *スピード/スタートレベル/エンドレベル取得
  2038.     bra    mstfdrlp
  2039. exit_mstrfdr:
  2040.     move.l    zmd_addr-work(a6),a1
  2041.     move.l    z_ctrl_flag(a1),d0
  2042.     bset.l    #CTRL_MFADER/4,d0
  2043.     move.l    d0,z_ctrl_flag(a1)
  2044.     tst.b    d3
  2045.     bne    find_end
  2046.     bra    cmpl_lp
  2047.  
  2048. mstrfdrdvid:
  2049.     dc.w    0    *FM
  2050.     dc.w    1    *ADPCM
  2051.     dc.w    $8000    *MIDI1
  2052.     dc.w    $8001    *MIDI2
  2053.     dc.w    $8002    *MIDI3
  2054.  
  2055. mfade_all:                *全パラメータ省略で全デバイス操作対象モード
  2056.                     *(全パラメータデフォルト値でフェードアウト)
  2057.     moveq.l    #CTRL_MFADER,d0        *コマンドコード
  2058.     jsr    do_wrt_ctrl_w-work(a6)
  2059.     moveq.l    #-1,d0            *'all' mark
  2060.     jsr    do_wrt_ctrl_w-work(a6)
  2061.     moveq.l    #%0000_0111,d0        *omt
  2062.     jsr    do_wrt_ctrl_b-work(a6)
  2063.     moveq.l    #fader_dflt_spd,d0    *speed
  2064.     jsr    do_wrt_ctrl_w-work(a6)
  2065.     moveq.l    #128,d0            *start level
  2066.     bsr    do_wrt_ctrl_b
  2067.     moveq.l    #0,d0            *end level
  2068.     bsr    do_wrt_ctrl_b
  2069.     bra    exit_mstrfdr
  2070.  
  2071. get_spd_str_end:
  2072.     * x d0
  2073. reglist    reg    d1-d3/d5
  2074.     movem.l    reglist,-(sp)
  2075.     moveq.l    #0,d2                *omt
  2076.     bsr    skip_sep
  2077.                         *get speed
  2078.     moveq.l    #fader_dflt_spd,d1        *default speed
  2079.     bsr    chk_num
  2080.     bmi    @f
  2081.     bsr    get_num
  2082.     cmpi.l    #fader_spd_max,d1
  2083.     bhi    m_illegal_speed_value
  2084.     bset.l    #0,d2
  2085. @@:
  2086.     move.l    d1,d3            *d3.l=speed
  2087.  
  2088.     bsr    skip_sep
  2089.                     *get start level
  2090.     bsr    chk_num
  2091.     bmi    @f
  2092.     bsr    get_num
  2093.     cmpi.l    #128,d1
  2094.     bhi    m_illegal_fader_level
  2095.     bset.l    #1,d2
  2096. @@:
  2097.     move.l    d1,d5
  2098.  
  2099.     bsr    skip_sep
  2100.                     *get end level
  2101.     bsr    chk_num
  2102.     bmi    @f
  2103.     bsr    get_num
  2104.     cmpi.l    #128,d1
  2105.     bhi    m_illegal_fader_level
  2106.     bset.l    #2,d2
  2107. @@:
  2108.     move.l    d2,d0
  2109.     jsr    do_wrt_ctrl_b-work(a6)    *omt
  2110.     lsr.b    #1,d2
  2111.     bcc    @f
  2112.     move.l    d3,d0
  2113.     jsr    do_wrt_ctrl_w-work(a6)    *speed
  2114. @@:
  2115.     lsr.b    #1,d2
  2116.     bcc    @f
  2117.     move.l    d5,d0
  2118.     jsr    do_wrt_ctrl_b-work(a6)    *start level
  2119. @@:
  2120.     lsr.b    #1,d2
  2121.     bcc    @f
  2122.     move.l    d1,d0            *end level
  2123.     jsr    do_wrt_ctrl_b-work(a6)
  2124. @@:
  2125.     bsr    skip_sep
  2126.     movem.l    (sp)+,reglist
  2127.     rts
  2128.  
  2129. track_fader:                *.TRACK_FADER
  2130. *    bsr    check_relation_cmn    *コマンド関係チェック
  2131.     moveq.l    #0,d3
  2132.     bsr    skip_eq
  2133.     cmp.l    a4,d4
  2134.     bls    tfade_all
  2135.     cmpi.b    #'{',(a4)
  2136.     bne    @f
  2137.     moveq.l    #-1,d3
  2138.     addq.w    #1,a4            *skip '{'
  2139. @@:
  2140.     bsr    skip_spc
  2141.     tst.l    d3
  2142.     beq    @f
  2143.     cmp.l    a4,d4
  2144.     bls    m_illegal_command_line
  2145.     cmpi.b    #'}',(a4)
  2146.     beq    tfade_all
  2147. @@:
  2148.     cmp.l    a4,d4
  2149.     bls    tfade_all
  2150. trkfdrlp:
  2151.     bsr    chk_num
  2152.     bpl    @f
  2153.     lea    trkfadr_dev-work(a6),a1
  2154.     bsr    get_com_no        *> d0
  2155.     bmi    exit_trkfdr
  2156.     moveq.l    #-1,d1            *全トラック指定
  2157.      bra    settrkfdrtrk
  2158. @@:
  2159.     bsr    get_num
  2160.     subq.l    #1,d1
  2161.     cmpi.l    #tr_max-1,d1
  2162.     bhi    m_illegal_track_number
  2163.     jsr    check_trk_no-work(a6)
  2164. settrkfdrtrk:
  2165.     moveq.l    #CTRL_TFADER,d0        *コマンドコード
  2166.     bsr    do_wrt_ctrl_w
  2167.     move.l    d1,d0
  2168.     jsr    reg_trkn_ctrl-work(a6)
  2169.     bsr    do_wrt_ctrl_w        *track number
  2170.     bsr    get_spd_str_end
  2171.     bra    trkfdrlp
  2172. exit_trkfdr:
  2173.     move.l    zmd_addr-work(a6),a1
  2174.     move.l    z_ctrl_flag(a1),d0
  2175.     bset.l    #CTRL_TFADER/4,d0
  2176.     move.l    d0,z_ctrl_flag(a1)
  2177.     tst.b    d3
  2178.     bne    find_end
  2179.     bra    cmpl_lp
  2180.  
  2181. tfade_all:                *全パラメータ省略で全トラック操作対象モード
  2182.                     *(全トラックデフォルト値でフェードアウト)
  2183.     moveq.l    #CTRL_TFADER,d0        *コマンドコード
  2184.     bsr    do_wrt_ctrl_w
  2185.     moveq.l    #-1,d0            *'all' mark
  2186.     bsr    do_wrt_ctrl_w
  2187.     moveq.l    #%0000_0111,d0        *omt
  2188.     jbsr    do_wrt_ctrl_b-work(a6)
  2189.     moveq.l    #fader_dflt_spd,d0    *speed
  2190.     bsr    do_wrt_ctrl_w
  2191.     moveq.l    #128,d0            *start level
  2192.     bsr    do_wrt_ctrl_b
  2193.     moveq.l    #0,d0            *end level
  2194.     bsr    do_wrt_ctrl_b
  2195.     bra    exit_trkfdr
  2196.  
  2197. check_ctrl_trk:            *指定されたトラックパラメータがダブっていないかチェック
  2198.     * < d1.w=track number
  2199.     * < d0.l=比較対象が何バイト後に再び出現するか
  2200.     * < a1.l=trackパラメータが格納されている先頭オフセットアドレス
  2201.     * x d0
  2202.     movem.l    d2-d3/a1,-(sp)
  2203.     move.l    ctrl_now-work(a6),d2
  2204.     cmp.l    d2,a1
  2205.     beq    exit_chkctrltrk
  2206.     move.l    ctrl_addr-work(a6),d0
  2207.     add.l    d0,d2        *limit address
  2208.     add.l    d0,a1        *scanning start address
  2209. @@:
  2210.     move.w    (a1)+,d3
  2211.     add.w    d0,a1        *next
  2212.     cmpi.w    #-1,d3
  2213.     beq    m_track_number_redesignation    *全トラック指定がすでになされていればエラー
  2214.     cmp.w    d0,d1
  2215.     beq    m_track_number_redesignation    *重複指定されている
  2216.     cmp.l    a1,d2
  2217.     bhi    @b
  2218. exit_chkctrltrk:
  2219.     movem.l    (sp)+,d2-d3/a1
  2220.     rts
  2221.  
  2222. track_mask:                *.TRACK_MASK
  2223. *    bsr    check_relation_cmn    *コマンド関係チェック
  2224.     moveq.l    #CTRL_MASK,d0        *コマンドコード
  2225.     bsr    do_wrt_ctrl_w
  2226.     moveq.l    #0,d3
  2227.     bsr    skip_eq
  2228.     cmp.l    a4,d4
  2229.     bls    maskoff_all
  2230.     cmpi.b    #'{',(a4)
  2231.     bne    @f
  2232.     moveq.l    #-1,d3
  2233.     addq.w    #1,a4            *skip '{'
  2234. @@:
  2235.     moveq.l    #0,d2            *指定されたデバイスのマーカー
  2236. trkmsklp:
  2237.     bsr    chk_num
  2238.     bpl    @f
  2239.     lea    msktrk_dev-work(a6),a1
  2240.     bsr    get_com_no        *> d0
  2241.     bmi    exit_trkmsklp
  2242.     moveq.l    #-1,d1            *全トラック指定
  2243.      bra    setmsktrktrk
  2244. @@:
  2245.     bsr    get_num
  2246.     subq.l    #1,d1
  2247.     cmpi.l    #tr_max-1,d1
  2248.     bhi    m_illegal_track_number
  2249.     jsr    check_trk_no-work(a6)
  2250. setmsktrktrk:
  2251.     moveq.l    #2,d0            *skip interval
  2252.     bsr    check_ctrl_trk        *ダブりチェック
  2253.     move.l    d1,d0
  2254.     jsr    reg_trkn_ctrl-work(a6)
  2255.     bsr    do_wrt_ctrl_w        *get track number
  2256.  
  2257.     bsr    skip_sep
  2258.  
  2259.     bsr    chk_num
  2260.     bpl    @f
  2261.     lea    msktrk_mode-work(a6),a1    *モード
  2262.     bsr    get_com_no        *> d0
  2263.     bmi    m_illegal_mode_value    *モード値が規定外
  2264.     move.l    d0,d1
  2265.     subq.w    #1,d1            *0-2 → -1,0,+1
  2266.      bra    setmsktrkmode
  2267. @@:
  2268.     bsr    get_num
  2269.     cmpi.l    #-1,d1
  2270.     blt    m_illegal_mode_value    *モード値が規定外
  2271.     cmpi.l    #1,d1
  2272.     bgt    m_illegal_mode_value    *モード値が規定外
  2273. setmsktrkmode:
  2274.     move.l    d1,d0
  2275.     bsr    do_wrt_ctrl_w        *mode(-1,0,+1)
  2276.  
  2277.     bsr    skip_sep
  2278.  
  2279.     moveq.l    #-1,d2            *正常に設定されたトラックが1つ以上はあるMARK
  2280.     bra    trkmsklp
  2281.  
  2282. exit_trkmsklp:
  2283.     tst.l    d2            *トラックが一つでも選択されたか
  2284.     beq    maskoff_all
  2285.     moveq.l    #-1,d0
  2286.     bsr    do_wrt_ctrl_w        *end code
  2287. exit_trkmsk:
  2288.     move.l    zmd_addr-work(a6),a1
  2289.     move.l    z_ctrl_flag(a1),d0
  2290.     bset.l    #CTRL_MASK/4,d0
  2291.     move.l    d0,z_ctrl_flag(a1)
  2292.     tst.b    d3
  2293.     bne    find_end
  2294.     bra    cmpl_lp
  2295.  
  2296. maskoff_all:                *全パラメータ省略で全トラック操作対象モード
  2297.                     *(全トラックマスク解除)
  2298.     moveq.l    #-1,d0            *'all' mark
  2299.     bsr    do_wrt_ctrl_w
  2300.     moveq.l    #0,d0            *enable
  2301.     bsr    do_wrt_ctrl_w
  2302.     bra    exit_trkmsk
  2303.  
  2304. relative_velocity:            *.RELATIVE_VELOCITY
  2305. *    bsr    check_relation_cmn    *コマンド関係チェック
  2306.     bsr    skip_eq
  2307.     cmp.l    a4,d4
  2308.     bls    m_parameter_cannot_be_omitted
  2309.     moveq.l    #0,d3
  2310.     cmpi.b    #'{',(a4)
  2311.     bne    @f
  2312.     addq.w    #1,a4
  2313.     moveq.l    #-1,d3
  2314. @@:
  2315.     lea    rltvvlcty_tbl-work(a6),a1
  2316.     bsr    get_com_no
  2317.     bmi    m_undefined_mode
  2318.     cmpi.w    #1,d0
  2319.     sls    velo_vol_ctrl-work(a6)
  2320.     tst.b    d3
  2321.     bne    find_end
  2322.     bra    cmpl_lp
  2323.  
  2324. t_velovol:                *相対ベロシティの記号エクスチェンジ
  2325. *    bsr    check_relation_cmn    *コマンド関係チェック
  2326.     moveq.l    #0,d1
  2327.     bsr    chk_num            *(u)だけの時は_が相対音量
  2328.     bmi    @f
  2329.     bsr    get_num
  2330. @@:
  2331.     tst.l    d1
  2332.     sne    velo_vol_ctrl-work(a6)
  2333.     bra    find_end
  2334.  
  2335. list:                    *.LIST
  2336.     clr.b    list_mode-work(a6)
  2337.     bra    cmpl_lp
  2338.  
  2339. nlist:
  2340.     st.b    list_mode-work(a6)
  2341.     bra    cmpl_lp
  2342.  
  2343. master_clock_cmd:            *.MASTER_CLOCK
  2344.     tst.b    assign_done-work(a6)
  2345.     bne    m_illegal_command_order    *コマンドの順番がまずい
  2346. *    bsr    check_relation_cmn    *コマンド関係チェック
  2347.     bsr    chk_num
  2348.     bpl    @f
  2349.     bsr    skip_eq
  2350.     cmp.l    a4,d4
  2351.     bls    m_parameter_cannot_be_omitted
  2352.     cmpi.b    #'{',(a4)+
  2353.     seq    d2
  2354.     bne    m_parameter_cannot_be_omitted
  2355.     bsr    chk_num
  2356.     bmi    m_parameter_cannot_be_omitted
  2357. @@:
  2358.     moveq.l    #0,d2
  2359.     bsr    get_num
  2360.     cmpi.l    #max_note_len,d1
  2361.     bhi    m_illegal_master_clock
  2362.     bra    @f
  2363.  
  2364. t_set_mclk:                *(Zn)全音符の絶対音長設定
  2365.     moveq.l    #1,d2            *終端カッコチェックの有無フラグ(1:checkあり)
  2366.     tst.b    assign_done-work(a6)
  2367.     bne    m_illegal_command_order    *コマンドの順番がまずい
  2368. *    bsr    check_relation_cmn    *コマンド関係チェック
  2369.     move.w    #192,d1
  2370.     bsr    chk_num            *(Z)だけの時は192
  2371.     bmi    @f
  2372.     bsr    get_num
  2373. @@:
  2374.     move.l    zmd_addr-work(a6),a1
  2375.     move.w    d1,z_master_clock(a1)    *情報ブロックにも書き込む
  2376.     tst.b    d2
  2377.     bne    find_end
  2378.     bra    cmpl_lp
  2379.  
  2380. meter:                    *.METER
  2381. *    bsr    check_relation_cmn    *コマンド関係チェック
  2382.     bsr    chk_num
  2383.     bpl    @f
  2384.     bsr    skip_eq
  2385.     cmp.l    a4,d4
  2386.     bls    m_parameter_cannot_be_omitted
  2387.     cmpi.b    #'{',(a4)+
  2388.     seq    d2
  2389.     bne    m_parameter_cannot_be_omitted
  2390.     bsr    chk_num
  2391.     bmi    m_parameter_cannot_be_omitted
  2392. @@:
  2393.     bsr    get_num
  2394.     cmpi.l    #255,d1
  2395.     bhi    m_illegal_meter
  2396.     move.l    d1,d3
  2397.     beq    m_illegal_meter
  2398.     bsr    skip_spc3
  2399.     cmp.l    a4,d4
  2400.     bls    m_parameter_cannot_be_omitted
  2401.     cmpi.b    #'/',(a4)
  2402.     bne    @f
  2403.     addq.w    #1,a4            *skip '/'
  2404. @@:
  2405.     bsr    chk_num
  2406.     bmi    m_parameter_cannot_be_omitted
  2407.     bsr    get_num
  2408.     cmpi.l    #255,d1
  2409.     bhi    m_illegal_meter
  2410.     lsl.w    #8,d3
  2411.     move.b    d1,d3
  2412.     beq    m_illegal_meter
  2413.     move.l    zmd_addr-work(a6),a1
  2414.     move.w    d3,z_meter(a1)        *情報ブロックにも書き込む
  2415.     tst.b    d2
  2416.     bne    find_end
  2417.     bra    cmpl_lp
  2418.  
  2419. mml_meter:                *[METER]
  2420. *    bsr    check_relation_cmn    *コマンド関係チェック
  2421.     bsr    chk_num
  2422.     bmi    m_parameter_cannot_be_omitted
  2423.     bsr    get_num
  2424.     cmpi.l    #255,d1
  2425.     bhi    m_illegal_meter
  2426.     move.l    d1,d3
  2427.     beq    m_illegal_meter
  2428.     bsr    skip_spc3
  2429.     cmp.l    a4,d4
  2430.     bls    m_parameter_cannot_be_omitted
  2431.     cmpi.b    #'/',(a4)
  2432.     bne    @f
  2433.     addq.w    #1,a4            *skip '/'
  2434. @@:
  2435.     bsr    chk_num
  2436.     bmi    m_parameter_cannot_be_omitted
  2437.     bsr    get_num
  2438.     cmpi.l    #255,d1
  2439.     bhi    m_illegal_meter
  2440.     lsl.w    #8,d3
  2441.     move.b    d1,d3
  2442.     beq    m_illegal_meter
  2443.     moveq.l    #seq_cmd_zmd,d0
  2444.     bsr    do_wrt_trk_b
  2445.     moveq.l    #METER_zmd,d0
  2446.     bsr    do_wrt_trk_b
  2447.     moveq.l    #2,d0
  2448.     bsr    do_wrt_trk_b
  2449.     move.l    d3,d0
  2450.     bra    do_wrt_trk_w
  2451.  
  2452. performance_time:                *.PERFORMANCE_TIME
  2453. *    bsr    check_relation_cmn        *コマンド関係チェック
  2454.     moveq.l    #0,d2
  2455.     bsr    chk_num
  2456.     bpl    @f
  2457.     bsr    skip_eq
  2458.     cmp.l    a4,d4
  2459.     bls    m_parameter_cannot_be_omitted
  2460.     cmpi.b    #'{',(a4)+
  2461.     seq    d2
  2462.     bne    m_parameter_cannot_be_omitted
  2463.     bsr    chk_num            *get hour
  2464.     bmi    m_parameter_cannot_be_omitted
  2465. @@:
  2466.     bsr    get_num
  2467.     cmpi.l    #65535,d1
  2468.     bhi    m_illegal_time_value
  2469.     move.l    d1,d3
  2470.     bsr    skip_eq
  2471.     bsr    chk_num            *get minute
  2472.     bmi    m_parameter_cannot_be_omitted
  2473.     bsr    get_num
  2474.     cmpi.l    #59,d1
  2475.     bhi    m_illegal_time_value
  2476.     lsl.l    #8,d3
  2477.     move.b    d1,d3
  2478.     bsr    skip_eq
  2479.     bsr    chk_num            *get second
  2480.     bmi    m_parameter_cannot_be_omitted
  2481.     bsr    get_num
  2482.     cmpi.l    #59,d1
  2483.     bhi    m_illegal_time_value
  2484.     lsl.l    #8,d3
  2485.     move.b    d1,d3
  2486.     move.l    zmd_addr-work(a6),a1
  2487.     move.l    d3,z_play_time(a1)        *情報ブロックに書き込む
  2488.     tst.b    d2
  2489.     bne    find_end
  2490.     bra    cmpl_lp
  2491.  
  2492. t_vset:                    *音色セット(v)
  2493. *    bsr    check_relation_cmn    *コマンド関係チェック
  2494.     bsr    init_fmsndnm
  2495.     moveq.l    #CMN_VSET,d0
  2496.     bsr    do_wrt_cmn_b
  2497.     bsr    chk_num
  2498.     bmi    m_parameter_cannot_be_omitted    *数字がないのでエラー
  2499.     bsr    get_num
  2500.     cmpi.l    #fmsnd_reg_max,d1
  2501.     bhi    m_illegal_timbre_number
  2502.     subq.l    #1,d1
  2503.     bcs    m_illegal_timbre_number
  2504.     move.l    d1,d0            *timbre number
  2505.     bsr    do_wrt_cmn_w
  2506.     bsr    skip_sep
  2507.     bsr    chk_num
  2508.     bmi    m_parameter_cannot_be_omitted
  2509.     bsr    get_num            *get v offset(dummy)
  2510.     moveq.l    #0,d0            *dummy
  2511.     bsr    do_wrt_cmn_b
  2512.     lea    std_55-work(a6),a1
  2513.     bsr    get_timbre_55_params
  2514.     lea    v_buffer-work(a6),a1
  2515.     move.b    $04(a1),d0    *0)LFRQ
  2516.     bsr    do_wrt_cmn_b
  2517.  
  2518.     move.b    $05(a1),d0    *1)PMD
  2519.     tas.b    d0
  2520.     bsr    do_wrt_cmn_b
  2521.     move.b    $06(a1),d0    *2)AMD
  2522.     bsr    do_wrt_cmn_b
  2523.                 *3)SYNC/OM/WF
  2524.     move.b    $01(a1),d0    *OM
  2525.     lsl.b    #3,d0
  2526.     tst.b    $03(a1)        *SYNC
  2527.     beq    @f
  2528.     tas.b    d0
  2529. @@:
  2530.     or.b    $02(a1),d0    *WF
  2531.     bsr    do_wrt_cmn_b
  2532.  
  2533.     move.b    $09(a1),d0    *PAN
  2534.     ror.b    #2,d0
  2535.     or.b    (a1),d0        *AF
  2536.     bsr    do_wrt_cmn_b    *4)PAN/AF
  2537.  
  2538.     move.b    $07(a1),d0    *PMS
  2539.     lsl.b    #4,d0
  2540.     or.b    $08(a1),d0    *AMS
  2541.     bsr    do_wrt_cmn_b    *5)
  2542. op_param:
  2543. ************************************************
  2544.     move.b    $13(a1),d0
  2545.     lsl.b    #4,d0
  2546.     or.b    $12(a1),d0
  2547.     bsr    do_wrt_cmn_b    *6)OP1:DT1/MUL
  2548.  
  2549.     move.b    $29(a1),d0
  2550.     lsl.b    #4,d0
  2551.     or.b    $28(a1),d0
  2552.     bsr    do_wrt_cmn_b    *7)OP3:DT1/MUL
  2553.  
  2554.     move.b    $1e(a1),d0
  2555.     lsl.b    #4,d0
  2556.     or.b    $1d(a1),d0
  2557.     bsr    do_wrt_cmn_b    *8)OP2:DT1/MUL
  2558.  
  2559.     move.b    $34(a1),d0
  2560.     lsl.b    #4,d0
  2561.     or.b    $33(a1),d0
  2562.     bsr    do_wrt_cmn_b    *9)OP4:DT1/MUL
  2563. ************************************************
  2564.     move.b    $10(a1),d0    *10)OP1:TL
  2565.     bsr    do_wrt_cmn_b
  2566.  
  2567.     move.b    $26(a1),d0    *11)OP3:TL
  2568.     bsr    do_wrt_cmn_b
  2569.  
  2570.     move.b    $1b(a1),d0    *12)OP2:TL
  2571.     bsr    do_wrt_cmn_b
  2572.  
  2573.     move.b    $31(a1),d0    *13)OP4:TL
  2574.     bsr    do_wrt_cmn_b
  2575.  
  2576.     move.b    $11(a1),d0
  2577.     ror.b    #2,d0
  2578.     or.b    $0b(a1),d0
  2579.     bsr    do_wrt_cmn_b    *14)OP1:KS/AR
  2580.  
  2581.     move.b    $27(a1),d0
  2582.     ror.b    #2,d0
  2583.     or.b    $21(a1),d0
  2584.     bsr    do_wrt_cmn_b    *15)OP3:KS/AR
  2585.  
  2586.     move.b    $1c(a1),d0
  2587.     ror.b    #2,d0
  2588.     or.b    $16(a1),d0
  2589.     bsr    do_wrt_cmn_b    *16)OP2:KS/AR
  2590.  
  2591.     move.b    $32(a1),d0
  2592.     ror.b    #2,d0
  2593.     or.b    $2c(a1),d0
  2594.     bsr    do_wrt_cmn_b    *17)OP4:KS/AR
  2595. ************************************************
  2596.     move.b    $15(a1),d0
  2597.     ror.b    #1,d0
  2598.     or.b    $0c(a1),d0
  2599.     bsr    do_wrt_cmn_b    *18)OP1:AME/1DR
  2600.  
  2601.     move.b    $2b(a1),d0
  2602.     ror.b    #1,d0
  2603.     or.b    $22(a1),d0
  2604.     bsr    do_wrt_cmn_b    *19)OP3:AME/1DR
  2605.  
  2606.     move.b    $20(a1),d0
  2607.     ror.b    #1,d0
  2608.     or.b    $17(a1),d0
  2609.     bsr    do_wrt_cmn_b    *20)OP2:AME/1DR
  2610.  
  2611.     move.b    $36(a1),d0
  2612.     ror.b    #1,d0
  2613.     or.b    $2d(a1),d0
  2614.     bsr    do_wrt_cmn_b    *21)OP4:AME/1DR
  2615. ************************************************
  2616.     move.b    $14(a1),d0
  2617.     ror.b    #2,d0
  2618.     or.b    $0d(a1),d0
  2619.     bsr    do_wrt_cmn_b    *22)OP1:DT2/2DR
  2620.  
  2621.     move.b    $2a(a1),d0
  2622.     ror.b    #2,d0
  2623.     or.b    $23(a1),d0
  2624.     bsr    do_wrt_cmn_b    *23)OP3:DT2/2DR
  2625.  
  2626.     move.b    $1f(a1),d0
  2627.     ror.b    #2,d0
  2628.     or.b    $18(a1),d0
  2629.     bsr    do_wrt_cmn_b    *24)OP2:DT2/2DR
  2630.  
  2631.     move.b    $35(a1),d0
  2632.     ror.b    #2,d0
  2633.     or.b    $2e(a1),d0
  2634.     bsr    do_wrt_cmn_b    *25)OP4:DT2/2DR
  2635. ************************************************
  2636.     move.b    $0f(a1),d0
  2637.     lsl.b    #4,d0
  2638.     or.b    $0e(a1),d0
  2639.     bsr    do_wrt_cmn_b    *26)OP1:D1L/RR
  2640.  
  2641.     move.b    $25(a1),d0
  2642.     lsl.b    #4,d0
  2643.     or.b    $24(a1),d0
  2644.     bsr    do_wrt_cmn_b    *27)OP3:D1L/RR
  2645.  
  2646.     move.b    $1a(a1),d0
  2647.     lsl.b    #4,d0
  2648.     or.b    $19(a1),d0
  2649.     bsr    do_wrt_cmn_b    *28)OP2:D1L/RR
  2650.  
  2651.     move.b    $30(a1),d0
  2652.     lsl.b    #4,d0
  2653.     or.b    $2f(a1),d0
  2654.     bsr    do_wrt_cmn_b    *29)OP4:D1L/RR
  2655. ************************************************
  2656. tt:
  2657.     move.l    temp_buffer-work(a6),a1
  2658.     moveq.l    #16-1,d1    *音色名の最大長
  2659. @@:                *音色名転送
  2660.     move.b    (a1)+,d0
  2661.     bsr    do_wrt_cmn_b
  2662.     dbeq    d1,@b
  2663.     move.l    zmd_addr-work(a6),a1
  2664.     move.l    z_cmn_flag(a1),d0
  2665.     bset.l    #CMN_VSET/4,d0
  2666.     move.l    d0,z_cmn_flag(a1)
  2667.     bra    find_end
  2668.  
  2669. fm_vset:                    *.FM_VSET
  2670. *    bsr    check_relation_cmn    *コマンド関係チェック
  2671.     bsr    init_fmsndnm
  2672.     moveq.l    #CMN_VSET,d0
  2673.     bsr    do_wrt_cmn_b
  2674.     bsr    get_pgm_number        *> d1.w=timbre number
  2675.     move.l    d1,-(sp)
  2676.     moveq.l    #'{',d1
  2677.     bsr    get_timbre_name
  2678.     bsr    skip_eq
  2679.     cmp.l    a4,d4
  2680.     bls    m_timbre_parameter_shortage
  2681.     move.l    (sp)+,d1
  2682.     cmpi.b    #'{',(a4)
  2683.     bne    tvst00
  2684.     addq.w    #1,a4
  2685.     bra    tvst00
  2686.  
  2687. get_pgm_number:                    *音色番号取得(FM音源のみ対応のサブルーチン)
  2688.     * > d1.w=timbre number(0-????)
  2689.     * x d2
  2690.     bsr    chk_num
  2691.     bmi    m_parameter_cannot_be_omitted    *音色番号の省略はできない
  2692.     bsr    get_num                *get 1st number
  2693.     bsr    skip_spc
  2694.     cmp.l    a4,d4
  2695.     bls    2f                *case:@n
  2696.     move.b    (a4),d0
  2697.     cmpi.b    #':',d0
  2698.     beq    @f
  2699.     cmp.b    #',',d0
  2700.     bne    2f
  2701. @@:
  2702.     addq.w    #1,a4                *skip ,
  2703.     bsr    chk_num
  2704.     bmi    2f                *m_illegal_command_line
  2705.     cmpi.l    #16383,d1
  2706.     bhi    m_illegal_bank_number
  2707.     move.l    d1,d2
  2708.     bsr    get_num                *get 2nd number
  2709.     bsr    skip_spc
  2710.     cmp.l    a4,d4
  2711.     bls    1f                *case:@b,n
  2712.     cmpi.b    #',',(a4)
  2713.     bne    1f
  2714.     cmpi.l    #127,d1
  2715.     bhi    m_illegal_bank_number
  2716.     cmpi.l    #127,d2
  2717.     bhi    m_illegal_bank_number
  2718.     lsl.l    #7,d2
  2719.     add.l    d1,d2
  2720.     bsr    skip_sep            *skip ,
  2721.     bsr    chk_num
  2722.     bmi    1f                *m_illegal_command_line
  2723.     bsr    get_num                *get 3rd number
  2724. 1:                        *case:@b1,b2,n
  2725.     subq.l    #1,d1
  2726.     cmpi.l    #127,d1
  2727.     bhi    m_illegal_timbre_number        *illegal sound number
  2728.     lsl.l    #7,d2
  2729.     add.l    d2,d1
  2730.     cmp.l    #fmsnd_reg_max-1,d1
  2731.     bhi    m_illegal_timbre_number        *illegal sound number
  2732.     rts
  2733. 2:                        *@n(音色番号が1つしか指定されていない場合)
  2734.     subq.l    #1,d1
  2735.     cmp.l    #fmsnd_reg_max-1,d1
  2736.     bhi    m_illegal_timbre_number        *illegal sound number
  2737.     rts
  2738.  
  2739. init_fmsndnm:
  2740.     move.l    temp_buffer-work(a6),a1
  2741.     move.l    #'    ',d0
  2742.     move.l    d0,(a1)+
  2743.     move.l    d0,(a1)+
  2744.     move.l    d0,(a1)+
  2745.     move.l    d0,(a1)+
  2746.     rts
  2747.  
  2748. get_timbre_name:
  2749.     * < d1.b=end character
  2750.     * > d3.l=文字列長
  2751.     * > d0.b=最後のキャラクター
  2752.     move.l    temp_buffer-work(a6),a1
  2753.     moveq.l    #0,d3            *str len
  2754.     bsr    skip_spc
  2755. tmbnmlp:                *get timbre name
  2756.     cmp.l    a4,d4
  2757.     bls    exit_tmbnmlp
  2758.     move.b    (a4)+,d0
  2759.     bsr    chk_kanji
  2760.     bpl    @f
  2761.     move.b    d0,(a1)+        *以下、漢字の場合
  2762.     addq.w    #1,d3
  2763.     cmpi.w    #fmsndname_len,d3
  2764.     bhi    m_timbre_name_too_long
  2765.     cmp.l    a4,d4
  2766.     bls    m_kanji_break_off    *漢字が途中で終わっている
  2767.     move.b    (a4)+,d0
  2768.     bra    st_tmbnmchr
  2769. @@:
  2770.     cmp.b    d1,d0
  2771.     beq    exit_tmbnmlp
  2772.     cmpi.b    #' ',d0
  2773.     bcs    exit_tmbnmlp
  2774. st_tmbnmchr:
  2775.     move.b    d0,(a1)+
  2776.     addq.w    #1,d3
  2777.     cmpi.w    #fmsndname_len,d3
  2778.     bls    tmbnmlp
  2779.     bra    m_timbre_name_too_long    *パターン名が長すぎます
  2780. exit_tmbnmlp:
  2781.     rts
  2782.  
  2783. t_vset_2:                *アルゴリズムフィードバック分離系モード
  2784. *    bsr    check_relation_cmn    *コマンド関係チェック
  2785.     bsr    init_fmsndnm
  2786.     moveq.l    #CMN_VSET,d0
  2787.     bsr    do_wrt_cmn_b
  2788.     bsr    chk_num
  2789.     bmi    m_illegal_timbre_number    *数字がないのでエラー
  2790.     bsr    get_num
  2791.     cmpi.l    #fmsnd_reg_max,d1
  2792.     bhi    m_illegal_timbre_number    *数字がないのでエラー
  2793.     subq.l    #1,d1
  2794.     bcs    m_illegal_timbre_number
  2795.     bsr    skip_sep
  2796. tvst00:
  2797.     bsr    chk_num
  2798.     bmi    m_timbre_parameter_shortage
  2799.     move.l    d1,d0
  2800.     bsr    do_wrt_cmn_w        *timbre number
  2801.     moveq.l    #0,d0            *dummy
  2802.     bsr    do_wrt_cmn_b
  2803.     lea    v_buffer+46-work(a6),a1    *テーブルにデフォルト値設定
  2804.     move.b    #$0f,(a1)+        *OM
  2805.     move.b    #$03,(a1)+        *PAN
  2806.     moveq.l    #7-1,d0
  2807. @@:
  2808.     clr.b    (a1)+
  2809.     dbra    d0,@b
  2810.     lea    alfb_55-work(a6),a1    *最大値テーブル
  2811.     bsr    get_timbre_55_params
  2812.  
  2813.     lea    v_buffer-work(a6),a1
  2814.  
  2815.     move.b    50(a1),d0        *0)LFRQ
  2816.     bsr    do_wrt_cmn_b
  2817.  
  2818.     move.b    51(a1),d0        *1)PMD
  2819.     tas.b    d0
  2820.     bsr    do_wrt_cmn_b
  2821.     move.b    52(a1),d0        *2)AMD
  2822.     bsr    do_wrt_cmn_b
  2823.                     *3)SYNC/OM/WF
  2824.     move.b    46(a1),d0        *OM
  2825.     lsl.b    #3,d0
  2826.     tst.b    49(a1)            *SYNC
  2827.     beq    @f
  2828.     tas.b    d0
  2829. @@:
  2830.     or.b    48(a1),d0        *WF
  2831.     bsr    do_wrt_cmn_b
  2832.  
  2833.     move.b    47(a1),d0        *PAN
  2834.     ror.b    #2,d0
  2835.     move.b    45(a1),d1        *FB
  2836.     lsl.b    #3,d1
  2837.     or.b    d1,d0
  2838.     or.b    44(a1),d0        *AL
  2839.     bsr    do_wrt_cmn_b
  2840.  
  2841.     move.b    53(a1),d0        *PMS
  2842.     lsl.b    #4,d0
  2843.     or.b    54(a1),d0        *AMS
  2844.     bsr    do_wrt_cmn_b
  2845.  
  2846.     lea    -11(a1),a1        *-11はつじつま合わせ
  2847.     bra    op_param
  2848.  
  2849. get_timbre_55_params:            *音色パラメータをテンポラリ・バッファに
  2850.     * < a1=parameter max list
  2851.     movem.l    d0-d3/a0-a1,-(sp)
  2852.     moveq.l    #55-1,d3        *一時的に格納する
  2853.     lea    v_buffer-work(a6),a0
  2854.     bsr    skip_sep
  2855. t_vset_lp:
  2856.     cmp.l    a4,d4
  2857.     bls    @f            *m_parameter_shortage    *パラメータが不足している
  2858.     bsr    chk_num
  2859.     bmi    @f            *m_parameter_shortage    *パラメータが不足している
  2860.     bsr    get_num
  2861.     moveq.l    #0,d0
  2862.     move.b    (a1)+,d0
  2863.     cmp.l    d0,d1
  2864.     bhi    m_illegal_timbre_parameter
  2865.     move.b    d1,(a0)+
  2866.     bsr    skip_sep
  2867.     dbra    d3,t_vset_lp
  2868. @@:
  2869.     movem.l    (sp)+,d0-d3/a0-a1
  2870.     rts
  2871.  
  2872. fm_master_volume:            *.FM_MASTER_VOLUME(ダミー)
  2873. *    bsr    check_relation_cmn    *コマンド関係チェック
  2874.     bsr    skip_eq
  2875.     cmp.l    a4,d4
  2876.     bls    m_parameter_cannot_be_omitted
  2877.     cmpi.b    #'{',(a4)
  2878.     seq    d2
  2879.     bne    @f
  2880.     addq.w    #1,a4
  2881. @@:
  2882.     bsr    chk_num
  2883.     bmi    m_parameter_cannot_be_omitted
  2884.     bsr    get_num
  2885.     tst.b    d2
  2886.     bne    find_end
  2887.     bra    cmpl_lp
  2888.  
  2889. pcm_tune_setup:                *PCMチューンセットアップ
  2890.     moveq.l    #CMN_PCM_TUNE_SETUP,d2
  2891.     bra    @f
  2892. fm_tune_setup:                *FMチューンセットアップ
  2893.     moveq.l    #CMN_FM_TUNE_SETUP,d2
  2894. @@:
  2895. *    bsr    check_relation_cmn    *コマンド関係チェック
  2896.     bsr    skip_eq
  2897.     move.l    #128,d1            * < d1.l=required n of data
  2898.     suba.l    a1,a1            * < a1.l=no limit check
  2899.     jsr    get_arry_params-work(a6)    *> arry_stock,d1.l=usable n of data
  2900.     move.l    d2,d0
  2901.     bsr    do_wrt_cmn_b
  2902.     move.l    arry_stock-work(a6),a1
  2903.     moveq.l    #128-1,d1
  2904. @@:
  2905.     move.b    (a1)+,d0
  2906.     bsr    do_wrt_cmn_b
  2907.     dbra    d1,@b
  2908.     bra    cmpl_lp
  2909.  
  2910. fixed_gatetime:                *.FIXED_GATETIME
  2911. *    bsr    check_relation_cmn    *コマンド関係チェック
  2912.     bsr    skip_eq
  2913.     cmp.l    a4,d4
  2914.     bls    m_parameter_cannot_be_omitted
  2915.     moveq.l    #0,d3            *fxgt>step
  2916.     move.b    (a4)+,d0
  2917.     cmpi.b    #'>',d0
  2918.     beq    @f
  2919.     cmpi.b    #'<',d0            *fxgt>step
  2920.     bne    m_illegal_command_line
  2921.     moveq.l    #-1,d3
  2922. @@:
  2923.     bsr    skip_eq
  2924.     lea    fxgt_str-work(a6),a1
  2925.     jsr    get_com_no-work(a6)
  2926.     bmi    m_illegal_command_line
  2927.     move.b    d3,fxgt_mode-work(a6)
  2928.     bra    cmpl_lp
  2929.  
  2930. gatetime_resolution:            *.GATE_RANGE(Qコマンドのレンジ設定)/非ZMD
  2931. *    bsr    check_relation_cmn    *コマンド関係チェック
  2932.     bsr    skip_eq
  2933.     moveq.l    #0,d3
  2934.     cmp.b    #'{',(a4)
  2935.     bne    @f
  2936.     addq.w    #1,a4
  2937.     moveq.l    #-1,d3
  2938. @@:
  2939.     bsr    chk_num
  2940.     bmi    m_parameter_cannot_be_omitted
  2941.     bsr    get_num
  2942.     moveq.l    #8,d0
  2943.     moveq.l    #3,d2
  2944. @@:
  2945.     cmp.b    d0,d1
  2946.     beq    @f
  2947.     addq.b    #1,d2
  2948.     add.b    d0,d0
  2949.     bcc    @b
  2950.     bra    m_illegal_gate_range
  2951. @@:
  2952.     move.b    d1,gate_range-work(a6)
  2953.     move.b    d2,gate_shift-work(a6)
  2954.     tst.b    d3
  2955.     bne    find_end
  2956.     bra    cmpl_lp
  2957.  
  2958.     .include    include.has
  2959.  
  2960. halt:                    *停止
  2961. *    bsr    check_relation_cmn    *コマンド関係チェック
  2962.     bsr    skip_eq
  2963.     moveq.l    #60,d1
  2964.     moveq.l    #0,d2
  2965.     bsr    chk_num
  2966.     bpl    @f
  2967.     cmp.l    a4,d4
  2968.     bls    1f
  2969.     cmpi.b    #'{',(a4)
  2970.     bne    1f
  2971.     moveq.l    #-1,d2
  2972.     addq.w    #1,a4            *skip '{'
  2973.     bsr    chk_num
  2974.     bmi    1f
  2975. @@:
  2976.     bsr    get_num
  2977. 1:
  2978.     moveq.l    #CMN_HALT,d0
  2979.     bsr    do_wrt_cmn_b
  2980.     move.l    d1,d0
  2981.     bsr    do_wrt_cmn_l
  2982.     move.l    zmd_addr-work(a6),a1
  2983.     move.l    z_cmn_flag(a1),d0
  2984.     bset.l    #CMN_HALT/4,d0
  2985.     move.l    d0,z_cmn_flag(a1)
  2986.     tst.b    d2
  2987.     bne    find_end
  2988.     bra    cmpl_lp
  2989.  
  2990. initialize:                *.INITIALIZE(イニシャライズ)
  2991. *    bsr    check_relation_cmn    *コマンド関係チェック
  2992.     bsr    skip_eq
  2993.     moveq.l    #0,d1
  2994.     moveq.l    #0,d2
  2995.     bsr    chk_num
  2996.     bpl    @f
  2997.     cmp.l    a4,d4
  2998.     bls    do_wrt_init
  2999.     cmpi.b    #'{',(a4)
  3000.     bne    do_wrt_init
  3001.     moveq.l    #-1,d2
  3002.     addq.w    #1,a4            *skip '{'
  3003.     bsr    chk_num
  3004.     bmi    do_wrt_init
  3005.     bra    @f
  3006.  
  3007. t_init:                    *(iN)イニシャライズ
  3008. *    bsr    check_relation_cmn    *コマンド関係チェック
  3009.     moveq.l    #0,d1
  3010.     moveq.l    #-1,d2
  3011.     bsr    chk_num
  3012.     bmi    do_wrt_init
  3013. @@:
  3014.     bsr    get_num            *'2'とすればv2コンパチモードに以降出来る
  3015. do_wrt_init:                *'3'とすればv3モードに以降出来る
  3016.     clr.b    adpcm_default_ch-work(a6)
  3017.     cmpi.b    #2,d1
  3018.     bne    @f
  3019.     st.b    v2_compatch-work(a6)
  3020. @@:
  3021.     moveq.l    #CMN_INIT,d0
  3022.     bsr    do_wrt_cmn_b
  3023.     move.l    d1,d0
  3024.     bsr    do_wrt_cmn_b
  3025.     move.l    zmd_addr-work(a6),a1
  3026.     move.l    z_cmn_flag(a1),d0
  3027.     bset.l    #CMN_INIT/4,d0
  3028.     move.l    d0,z_cmn_flag(a1)
  3029.     tst.b    d2
  3030.     bne    find_end
  3031.     bra    cmpl_lp
  3032.  
  3033. length_mode:                *.LENGTH_MODE
  3034. *    bsr    check_relation_cmn    *コマンド関係チェック
  3035.     bsr    skip_eq
  3036.     cmp.l    a4,d4
  3037.     bls    m_parameter_cannot_be_omitted
  3038.     moveq.l    #0,d3
  3039.     cmpi.b    #'{',(a4)
  3040.     bne    @f
  3041.     addq.w    #1,a4
  3042.     moveq.l    #-1,d3
  3043. @@:
  3044.     bsr    chk_num
  3045.     bpl    @f
  3046.     lea    iptmd_tbl-work(a6),a1
  3047.     bsr    get_com_no
  3048.     bmi    m_undefined_mode
  3049.     tst.l    d0
  3050.     sne    step_input-work(a6)
  3051.     tst.b    d3
  3052.     bne    find_end
  3053.     bra    cmpl_lp
  3054. @@:
  3055.     bsr    get_num
  3056.     tst.l    d1
  3057.     sne    step_input-work(a6)
  3058.     tst.b    d3
  3059.     bne    find_end
  3060.     bra    cmpl_lp
  3061.  
  3062. key:                    *.KEY
  3063. *    bsr    check_relation_cmn    *コマンド関係チェック
  3064.     bsr    chk_num
  3065.     bpl    @f
  3066.     bsr    skip_eq
  3067.     cmp.l    a4,d4
  3068.     bls    m_parameter_cannot_be_omitted
  3069.     cmpi.b    #'{',(a4)
  3070.     seq    d3
  3071.     bne    1f            *bne m_parameter_cannot_be_omitted
  3072.     addq.w    #1,a4
  3073.     bsr    chk_num
  3074.     bpl    @f
  3075. 1:
  3076.     bsr    string_key_case        *文字列による指定
  3077.     bra    do_set_key
  3078. @@:
  3079.     bsr    get_num
  3080.     cmpi.l    #7,d1
  3081.     bhi    m_too_many_signs    *記号の個数が多すぎる
  3082.     bsr    skip_sep
  3083.     cmp.l    a4,d4
  3084.     bls    m_parameter_cannot_be_omitted
  3085.     move.b    (a4)+,d0
  3086.     cmpi.b    #'#',d0            *recog. signs
  3087.     beq    get_mjmn
  3088.     cmpi.b    #'+',d0
  3089.     beq    get_mjmn
  3090.     cmpi.b    #'b',d0
  3091.     beq    @f
  3092.     cmpi.b    #'-',d0
  3093.     bne    m_illegal_sign        *未定義の記号
  3094. @@:
  3095.     neg.l    d1
  3096. get_mjmn:                *調の取得
  3097.     bsr    skip_sep
  3098.     cmp.l    a4,d4
  3099.     bls    m_parameter_cannot_be_omitted
  3100.     lea    MJMN_tbl-work(a6),a1
  3101.     bsr    get_com_no
  3102.     bmi    m_unknown_key_declared    *未知の調を宣言している
  3103.     lsl.w    #8,d1
  3104.     move.b    d0,d1
  3105. do_set_key:
  3106.     move.l    zmd_addr-work(a6),a1
  3107.     move.w    d1,z_key(a1)        *情報ブロックにも書き込む
  3108.     tst.b    d3
  3109.     bne    find_end
  3110.     bra    cmpl_lp
  3111.  
  3112. string_key_case:            *文字列による指定の場合
  3113.     lea    KEY_tbl-work(a6),a1    *cmd tbl
  3114.     bsr    get_com_no        *>d0.w=com no.
  3115.     bmi    m_unknown_key_declared    *未知の調を宣言している
  3116.     add.w    d0,d0
  3117.     move.w    KEY_v_tbl(pc,d0.w),d1
  3118.     rts
  3119.  
  3120. KEY_v_tbl:
  3121.     dc.b    0,0,1,0,2,0,3,0,4,0,5,0,6,0,6,0,7,0,7,0
  3122.     dc.b    0,0,-1,0,-2,0,-2,0,-3,0,-3,0,-4,0,-4,0,-5,0,-5,0,-6,0,-6,0,-7,0,-7,0
  3123.     dc.b    0,1,1,1,2,1,3,1,3,1,4,1,4,1,5,1,5,1,6,1,6,1,7,1,7,1
  3124.     dc.b    0,1,-1,1,-2,1,-3,1,-4,1,-5,1,-5,1,-6,1,-6,1,-7,1,-7,1
  3125.  
  3126. mml_key:                *.KEY
  3127.     bsr    chk_num
  3128.     bpl    @f
  3129.     bsr    string_key_case        *文字列による指定
  3130.     bra    mml_do_set_key
  3131. @@:
  3132.     bsr    get_num
  3133.     cmpi.l    #7,d1
  3134.     bhi    m_too_many_signs    *記号の個数が多すぎる
  3135.     bsr    skip_sep
  3136.     cmp.l    a4,d4
  3137.     bls    m_parameter_cannot_be_omitted
  3138.     move.b    (a4)+,d0
  3139.     cmpi.b    #'#',d0            *recog. signs
  3140.     beq    1f
  3141.     cmpi.b    #'+',d0
  3142.     beq    1f
  3143.     cmpi.b    #'b',d0
  3144.     beq    @f
  3145.     cmpi.b    #'-',d0
  3146.     bne    m_illegal_sign        *未定義の記号
  3147. @@:
  3148.     neg.l    d1
  3149. 1:                    *調の取得
  3150.     bsr    skip_sep
  3151.     cmp.l    a4,d4
  3152.     bls    m_parameter_cannot_be_omitted
  3153.     lea    MJMN_tbl-work(a6),a1
  3154.     bsr    get_com_no
  3155.     bmi    m_unknown_key_declared    *未知の調を宣言している
  3156.     lsl.w    #8,d1
  3157.     move.b    d0,d1
  3158. mml_do_set_key:
  3159.     moveq.l    #seq_cmd_zmd,d0
  3160.     bsr    do_wrt_trk_b
  3161.     moveq.l    #KEY_zmd,d0
  3162.     bsr    do_wrt_trk_b
  3163.     moveq.l    #2,d0
  3164.     bsr    do_wrt_trk_b
  3165.     move.l    d1,d0
  3166.     bra    do_wrt_trk_w
  3167.  
  3168. t_midi_trns:                *MIDI DATA TRANSFER (x)
  3169.     moveq.l    #CMN_MIDI_TRANSMISSION,d0
  3170.     bsr    do_wrt_cmn_b
  3171.     moveq.l    #-1,d0
  3172.     bsr    do_wrt_cmn_b        *出力先(-1:current)
  3173.     addq.w    #0+1+4+1,a0        *0(str)+1(strlen)+4(datalen)+1(at least 1 data)
  3174.     bsr    chk_membdr_cmn        *一応、最低必要分メモリは確保
  3175.     subq.w    #0+1+4+1,a0
  3176.     moveq.l    #0,d0            *文字列なし
  3177.     move.b    d0,exclusive_flg-work(a6)
  3178.     bsr    do_wrt_cmn_b        *コメントバイト数=0
  3179.     bsr    skip_sep
  3180.     cmp.l    a4,d4
  3181.     bls    m_parameter_break_off    *パラメータが途中で終わっています
  3182.     bra    secure_mdtdtln
  3183.  
  3184. roland_exclusive:            *Roland EXCLUSIVE
  3185.     moveq.l    #-1,d2
  3186.     bsr    chk_num
  3187.     bmi    @f
  3188.     bsr    get_num        *get dev ID
  3189.     cmpi.l    #127,d1
  3190.     bhi    m_illegal_device_id
  3191.     move.l    d1,d2
  3192. @@:
  3193.     bsr    skip_sep
  3194.     moveq.l    #-1,d3
  3195.     bsr    chk_num
  3196.     bmi    @f
  3197.     bsr    get_num        *get model ID
  3198.     cmpi.l    #127,d1
  3199.     bhi    m_illegal_model_id
  3200.     move.l    d1,d3
  3201. @@:
  3202.     move.b    #MKID_ROLAND,exclusive_flg-work(a6)    *(頭に$f0,$41,尻にchecksum,$f7がつく)
  3203.     bsr    skip_sep
  3204.     bra    _midi_data
  3205.  
  3206. yamaha_exclusive:            *YAMAHA EXCLUSIVE
  3207.     moveq.l    #-1,d2
  3208.     bsr    chk_num
  3209.     bmi    @f
  3210.     bsr    get_num        *get dev ID
  3211.     cmpi.l    #127,d1
  3212.     bhi    m_illegal_device_id
  3213.     move.l    d1,d2
  3214. @@:
  3215.     bsr    skip_sep
  3216.     moveq.l    #-1,d3
  3217.     bsr    chk_num
  3218.     bmi    @f
  3219.     bsr    get_num        *get model ID
  3220.     cmpi.l    #127,d1
  3221.     bhi    m_illegal_model_id
  3222.     move.l    d1,d3
  3223. @@:
  3224.     move.b    #MKID_YAMAHA,exclusive_flg-work(a6)    *(頭に$f0,$43,尻にchecksum,$f7がつく)
  3225.     bsr    skip_sep
  3226.     bra    _midi_data
  3227.  
  3228. exclusive:                    *EXCLUSIVE MIDI DATA TRANSFER (.EXCLUSIVE)
  3229.     st.b    exclusive_flg-work(a6)        *(頭に$f0,尻に$f7がつくだけ)
  3230.     bra    _midi_data
  3231. midi_data:                    *MIDI DATA TRANSFER (.MIDI_DATA)
  3232.     clr.b    exclusive_flg-work(a6)
  3233. _midi_data:
  3234.     moveq.l    #-1,d1                *出力先(-1:current(default))
  3235.     bsr    chk_num
  3236.     bmi    @f
  3237.     bsr    get_num                *get I/F number
  3238.     subq.l    #1,d1                *0-2
  3239.     cmpi.l    #if_max-1,d1
  3240.     bhi    m_illegal_interface_number
  3241. @@:
  3242.     tst.b    exclusive_flg-work(a6)
  3243.     ble    go_midi_data            *roland,yamaha以外はスキップ
  3244.     tst.l    d1                *以下roland_exclusiveケース(exclusive_flg=1)
  3245.     bpl    @f
  3246.     move.l    d2,d0                *roland_exclusiveの場合はI/Fを省略した場合は
  3247.     or.l    d3,d0                *dev,mdlの省略はできない
  3248.     bmi    m_parameter_cannot_be_omitted
  3249.     move.b    d2,d5
  3250.     lsl.w    #8,d5
  3251.     move.b    d3,d5
  3252.     bra    go_midi_data
  3253. @@:                        *インターフェース番号明記ケース
  3254.     move.l    d1,d0                *roland exclusiveの場合はデバイスIDと
  3255.     add.w    d0,d0                *モデルIDを省略時の時のために保存しておく
  3256.     lea    dev_mdl_ID-work(a6),a1
  3257.     add.w    d0,a1
  3258.     tst.l    d2
  3259.     bmi    @f
  3260.     move.b    d2,(a1)            *save devID
  3261. @@:
  3262.     tst.l    d3
  3263.     bmi    @f
  3264.     move.b    d3,1(a1)        *save mdlID
  3265. @@:
  3266.     move.w    (a1),d5            *d5=dev,mdl
  3267. go_midi_data:
  3268.     moveq.l    #CMN_MIDI_TRANSMISSION,d0
  3269.     bsr    do_wrt_cmn_b
  3270.     move.l    d1,d0                *I/F number(0-2)
  3271.     bsr    do_wrt_cmn_b            *出力先
  3272.     bsr    get_mdtr_str            *コメント取得
  3273. secure_mdtdtln:
  3274.     move.l    zmd_now-work(a6),a1        *>a1.l=データ長格納先オフセットアドレス
  3275.     bsr    do_wrt_cmn_l            *データ長
  3276.     moveq.l    #0,d3
  3277.     move.b    exclusive_flg-work(a6),d1    *Exclusiveか
  3278.     beq    1f
  3279.     moveq.l    #$f0,d0
  3280.     bsr    do_wrt_cmn_b            *Header of Exclusive
  3281.     moveq.l    #2,d3                *HOX&EOX
  3282.     tst.b    d1                *Roland Exc.か
  3283.     ble    1f
  3284.     move.l    d1,d0
  3285.     bsr    do_wrt_cmn_b            *MAKER ID($41 or $43)
  3286.     move.w    d5,d0
  3287.     bsr    do_wrt_cmn_w            *dev,mdl
  3288.     cmpi.b    #MKID_YAMAHA,d1
  3289.     beq    @f
  3290.     moveq.l    #$12,d0
  3291.     bsr    do_wrt_cmn_b            *Data Set cmd
  3292.     moveq.l    #7,d3                *HOX,MAKER,DEV,MDL,DT1,...,checksum,EOX
  3293.     bra    1f
  3294. @@:
  3295.     move.l    zmd_now-work(a6),a2        *>a2.l=データ長格納先オフセットアドレス
  3296.     bsr    do_wrt_cmn_w            *データ長
  3297.     moveq.l    #8,d3                *HOX,MAKER,DEV,MDL,LENGTH,...,checksum,EOX
  3298. 1:
  3299.     moveq.l    #0,d2                *sum
  3300. mdtr_lp:
  3301.     bsr    skip_sep
  3302.     cmp.l    a4,d4
  3303.     bls    m_parameter_break_off    *パラメータが不足している
  3304.     cmpi.b    #'"',(a4)
  3305.     bne    @f
  3306.     bsr    set_str_to_cmn        *文字列データ
  3307.     bra    mdtr_lp
  3308. @@:
  3309.     cmpi.b    #"'",(a4)
  3310.     bne    @f
  3311.     bsr    set_str_to_cmn        *文字列データ
  3312.     bra    mdtr_lp
  3313. @@:
  3314.     bsr    chk_num
  3315.     bmi    exit_mdtr        *データもう無し
  3316.     bsr    get_num
  3317.     bsr    sstc_do_wrt_cmn_b
  3318.     bra    mdtr_lp
  3319. exit_mdtr:
  3320.     move.b    exclusive_flg-work(a6),d1
  3321.     beq    set_mdtr_size
  3322.     bmi    1f
  3323.     cmpi.b    #MKID_YAMAHA,d1
  3324.     bne    @f
  3325.     move.l    d3,d0        *ヤマハの場合は転送バイト数もチェックサムに考慮
  3326.     sub.l    #8+3,d0        *転送バイト数の有効性に付いては後でチェック(3はアドレス分)
  3327.     move.w    d0,-(sp)
  3328.     andi.w    #$7f,d0
  3329.     add.b    d0,d2
  3330.     move.w    (sp)+,d0
  3331.     lsr.w    #7,d0
  3332.     andi.w    #$7f,d0
  3333.     add.b    d0,d2
  3334. @@:
  3335.     moveq.l    #$80,d0
  3336.     andi.b    #$7f,d2
  3337.     sub.b    d2,d0                *d0=Roland check sum value
  3338.     andi.b    #$7f,d0
  3339.     bsr    do_wrt_cmn_b            *checksum
  3340. 1:
  3341.     moveq.l    #$f7,d0
  3342.     bsr    do_wrt_cmn_b            *End of Exclusive
  3343. set_mdtr_size:
  3344.     tst.l    d3
  3345.     beq    m_parameter_shortage
  3346.     add.l    zmd_addr-work(a6),a1
  3347.     rept    4
  3348.     rol.l    #8,d3
  3349.     move.b    d3,(a1)+    *データ長を格納
  3350.     endm
  3351.     cmpi.b    #MKID_YAMAHA,d1
  3352.     bne    @f
  3353.     add.l    zmd_addr-work(a6),a2
  3354.     sub.l    #8+3,d3
  3355.     ble    m_parameter_shortage
  3356.     cmpi.l    #16384,d3
  3357.     bhi    m_too_many_parameters
  3358.     move.w    d3,d0
  3359.     lsr.w    #7,d0
  3360.     andi.w    #$7f,d0
  3361.     move.b    d0,(a2)+    *データ長を格納
  3362.     andi.w    #$7f,d3
  3363.     move.b    d3,(a2)+    *データ長を格納
  3364. @@:
  3365.     move.l    zmd_addr-work(a6),a1
  3366.     move.l    z_cmn_flag(a1),d0
  3367.     bset.l    #CMN_MIDI_TRANSMISSION/4,d0
  3368.     move.l    d0,z_cmn_flag(a1)
  3369.     bra    find_end
  3370.  
  3371. get_mdtr_str:                    *コメント取得
  3372.     * > 0(a0)=comment length:0-255
  3373.     * > 1(a0)...=comment string(no endcode)
  3374.     * X d1,d3,a1
  3375.     moveq.l    #0,d3                *文字列長=0
  3376.     move.l    zmd_now-work(a6),a1        *>a1.l=文字長格納先オフセットアドレス
  3377.     bsr    do_wrt_cmn_b            *コメントバイト数(この時点ではdummy)
  3378.     bsr    skip_eq
  3379.     cmp.l    a4,d4
  3380.     bls    m_parameter_break_off        *パラメータが途中で終わっています
  3381.     cmpi.b    #'{',(a4)            *文字列はなし
  3382.     bne    @f
  3383.     addq.w    #1,a4                *skip {
  3384.     bra    get_mdtr_data
  3385. @@:
  3386.     move.w    #255-1,d1            *文字数
  3387.     bsr    get_string            *コメント取得 > d3.l=文字数
  3388. get_mdtr_data:
  3389.     add.l    zmd_addr-work(a6),a1
  3390.     move.b    d3,(a1)                *文字長格納
  3391.     rts
  3392.  
  3393. get_string:
  3394.     * < d1.w=最大文字数-1
  3395.     * > d3.l=文字数
  3396.     moveq.l    #0,d3
  3397.     bsr    skip_spc
  3398. tmtlp:
  3399.     cmp.l    a4,d4
  3400.     bls    m_string_break_off        *文字列が途中で終わっている
  3401.     move.b    (a4)+,d0
  3402.     bsr    chk_kanji        *漢字かどうかチェック
  3403.     bpl    @f
  3404.     bsr    do_wrt_cmn_b
  3405.     addq.w    #1,d3            *ins str len
  3406.     subq.w    #1,d1
  3407.     bcs    exit_gtstr
  3408.     cmp.l    a4,d4
  3409.     bls    m_string_break_off    *文字列が中途半端
  3410.     move.b    (a4)+,d0
  3411.     bra    tmtstr_next
  3412. @@:
  3413.     cmp.b    #$0a,d0
  3414.     bne    @f
  3415.     bsr    cr_line            *改行
  3416.     bra    exit_gtstr
  3417. @@:
  3418.     cmpi.b    #'=',d0
  3419.     bne    @f
  3420.     cmp.l    a4,d4            *={ は一組で考える
  3421.     bls    tmtstr_next
  3422.     cmpi.b    #'{',(a4)
  3423.     bne    tmtstr_next
  3424.     addq.w    #1,a4
  3425.     bra    exit_gtstr
  3426. @@:
  3427.     cmp.b    #'{',d0            *文字列終了
  3428.     beq    exit_gtstr
  3429. tmtstr_next:
  3430.     bsr    do_wrt_cmn_b
  3431.     addq.w    #1,d3            *ins str len
  3432.     dbra    d1,tmtlp
  3433. skip_gtstr:                *規定文字数より長い文字列はスキップ
  3434.     cmp.l    a4,d4
  3435.     bls    m_string_break_off    *文字列が途中で終わっている
  3436.     move.b    (a4)+,d0
  3437.     bsr    chk_kanji        *漢字かどうかチェック
  3438.     bpl    @f
  3439.     cmp.l    a4,d4
  3440.     bls    m_string_break_off    *文字列が中途半端
  3441.     move.b    (a4)+,d0
  3442.     bra    skip_gtstr
  3443. @@:
  3444.     cmp.b    #$0a,d0
  3445.     bne    @f
  3446.     bsr    cr_line            *改行
  3447.     bra    exit_gtstr
  3448. @@:
  3449.     cmp.b    #'{',d0            *文字列終了
  3450.     bne    skip_gtstr
  3451. exit_gtstr:
  3452.     rts
  3453.  
  3454. set_str_to_cmn:                *文字列をソースより摘出してZMD化
  3455.     * < d1.l=data
  3456.     * < d2.b=sum
  3457.     * < d3.l=data length
  3458.     * > d2.b=sum
  3459.     * > d3.l=added data length
  3460.     * - all                *(必ず"で囲まれている)
  3461. reglist    reg    d0/d5
  3462.     movem.l    reglist,-(sp)
  3463.     cmp.l    a4,d4
  3464.     bls    m_parameter_cannot_be_omitted
  3465.     cmpi.b    #'"',(a4)
  3466.     beq    @f
  3467.     cmpi.b    #"'",(a4)
  3468.     bne    m_string_break_off
  3469. @@:
  3470.     move.b    (a4)+,d5        *文字列終端記号
  3471.     moveq.l    #0,d0
  3472. sstclp00:
  3473.     cmp.l    a4,d4
  3474.     bls    exit_sstclp00
  3475.     move.b    (a4)+,d0
  3476.     move.l    d0,d1
  3477.     bsr    chk_kanji
  3478.     bpl    @f
  3479.     bsr    sstc_do_wrt_cmn_b
  3480.     cmp.l    a4,d4
  3481.     bls    m_kanji_break_off    *漢字が途中で終わっている
  3482.     move.b    (a4)+,d1
  3483.     bsr    sstc_do_wrt_cmn_b
  3484.     bra    sstclp00
  3485. @@:
  3486.     cmp.b    d5,d1
  3487.     beq    exit_sstclp00
  3488.     cmpi.b    #$0d,d1            *$0dは無視
  3489.     beq    sstclp00
  3490.     cmpi.b    #$0a,d1
  3491.     beq    @f
  3492.     bsr    sstc_do_wrt_cmn_b
  3493.     bra    sstclp00
  3494. @@:
  3495.     bsr    cr_line
  3496.     moveq.l    #$0d,d1
  3497.     bsr    sstc_do_wrt_cmn_b
  3498.     moveq.l    #$0a,d1
  3499.     bsr    sstc_do_wrt_cmn_b
  3500.     tst.b    d1
  3501.     bne    sstclp00
  3502. exit_sstclp00:
  3503.     movem.l    (sp)+,reglist
  3504.     rts
  3505.  
  3506. sstc_do_wrt_cmn_b:
  3507.     * < d1.l=data
  3508.     * < d2.b=sum
  3509.     * < d3.l=data length
  3510.     * > d2.b=sum
  3511.     * > d3.l=added data length
  3512.     tst.b    exclusive_flg-work(a6)
  3513.     beq    @f
  3514.     cmpi.l    #$7f,d1            *exclusiveならば$f0..$f7間は必ず7bit以下
  3515.     bhi    1f
  3516. @@:
  3517.     cmpi.l    #$ff,d1            *生データ送信ならば8bit以下
  3518.     bhi    1f
  3519.     move.b    d1,d0
  3520.     add.b    d0,d2
  3521.     bsr    do_wrt_cmn_b
  3522.     addq.l    #1,d3            *inc data len
  3523.     rts
  3524. 1:                    *255より大きい値は7ビット毎に分けて送信
  3525.     move.b    d1,d0
  3526.     andi.b    #$7f,d0
  3527.     add.b    d0,d2
  3528.     bsr    do_wrt_cmn_b
  3529.     addq.l    #1,d3            *inc data len
  3530.     lsr.l    #7,d1
  3531.     bne    1b
  3532.     rts
  3533.  
  3534. midi_dump:                *.MIDI_DUMP(MIDIダンプファイル送信)
  3535. *    bsr    check_relation_cmn    *コマンド関係チェック
  3536.     moveq.l    #-1,d1            *-1:default interface
  3537.     moveq.l    #0,d2
  3538.     bsr    chk_num
  3539.     bpl    @f
  3540.     bsr    skip_eq
  3541.     cmp.l    a4,d4
  3542.     bls    m_parameter_cannot_be_omitted
  3543.     cmp.b    #'{',(a4)
  3544.     seq    d2
  3545.     bne    set_mddpifn
  3546.                     *'{'で始まっているケース
  3547.     addq.w    #1,a4            *skip '{'
  3548.     bsr    chk_num
  3549.     bmi    set_mddpifn
  3550. @@:                    *インターフェース番号取得
  3551.     bsr    get_num            *get I/F number
  3552.     subq.l    #1,d1            *0-2
  3553.     cmpi.l    #if_max-1,d1
  3554.     bhi    m_illegal_interface_number
  3555.     bsr    skip_sep
  3556. set_mddpifn:
  3557.     moveq.l    #CMN_MIDI_DUMP,d0
  3558.     bsr    do_wrt_cmn_b
  3559.     move.l    d1,d0
  3560.     bsr    do_wrt_cmn_b
  3561.     bsr    set_fn_to_cmn        *ファイルネームのZMD化
  3562.     move.l    zmd_addr-work(a6),a1
  3563.     move.l    z_cmn_flag(a1),d0
  3564.     bset.l    #CMN_MIDI_DUMP/4,d0
  3565.     move.l    d0,z_cmn_flag(a1)
  3566.     tst.b    d2
  3567.     bne    find_end
  3568.     bra    cmpl_lp
  3569.  
  3570. zpd_equ:                *.ZPD(ZPD組み込み命令)
  3571. adpcm_block_data:            *.ADPCM_BLOCK_DATA(ZPD組み込み命令)
  3572. *    bsr    check_relation_cmn    *コマンド関係チェック
  3573.     moveq.l    #CMN_BLOCK_PCM,d0
  3574.     bsr    do_wrt_cmn_b
  3575.     bsr    skip_eq
  3576.     bsr    set_fn_to_cmn        *ファイルネームのZMD化
  3577.     move.l    zmd_addr-work(a6),a1
  3578.     move.l    z_cmn_flag(a1),d0
  3579.     bset.l    #CMN_BLOCK_PCM/4,d0
  3580.     move.l    d0,z_cmn_flag(a1)
  3581.     bra    cmpl_lp
  3582.  
  3583. adpcm_list:                *.ADPCM_LIST(ADPCM定義ファイル読み込み)
  3584. call:                    *.CALL(外部ZMS読み込み)
  3585. *    bsr    check_relation_cmn    *コマンド関係チェック
  3586.     moveq.l    #CMN_READ_SUB,d0
  3587.     bsr    do_wrt_cmn_b
  3588.     bsr    set_fn_to_cmn        *ファイルネームのZMD化
  3589.     move.l    zmd_addr-work(a6),a1
  3590.     move.l    z_cmn_flag(a1),d0
  3591.     bset.l    #CMN_READ_SUB/4,d0
  3592.     move.l    d0,z_cmn_flag(a1)
  3593.     bra    cmpl_lp
  3594.  
  3595.     .include    pcmproc.has
  3596.  
  3597. comment:                *.COMMENT(コメント文)
  3598. *    bsr    check_relation_cmn    *コマンド関係チェック
  3599.     moveq.l    #CMN_COMMENT,d0
  3600.     move.l    a0,a2
  3601.     bsr    do_wrt_cmn_b
  3602.     bsr    set_cmt_to_cmn        *文字列のZMD化
  3603.     move.l    zmd_addr-work(a6),a1
  3604.     move.l    z_cmn_flag(a1),d0
  3605.     bset.l    #CMN_COMMENT/4,d0
  3606.     bne    @f
  3607.     sub.l    a1,a2            *初めのコメントはタイトルとみなす
  3608.     sub.w    #z_title_offset+4-1,a2
  3609.     move.l    a2,z_title_offset(a1)
  3610. @@:
  3611.     move.l    d0,z_cmn_flag(a1)
  3612.     bra    cmpl_lp
  3613.  
  3614. set_cmt_to_cmn:                *コメントをソースより摘出してZMD化
  3615.     * - all                *{}で囲まれている可能性があるケース
  3616. reglist    reg    d0-d3
  3617.     movem.l    reglist,-(sp)
  3618.     bsr    skip_eq
  3619.     cmp.l    a4,d4
  3620.     bls    m_parameter_cannot_be_omitted
  3621.     cmpi.b    #'{',(a4)
  3622.     seq    d1
  3623.     bne    @f
  3624.     addq.w    #1,a4
  3625. @@:
  3626.     moveq.l    #0,d3
  3627. _sftclp00:
  3628.     cmp.l    a4,d4
  3629.     bls    _exit_sftclp00
  3630.     move.b    (a4)+,d0
  3631.     bsr    chk_kanji
  3632.     bpl    @f
  3633.     bsr    do_wrt_cmn_b
  3634.     cmp.l    a4,d4
  3635.     bls    m_kanji_break_off    *漢字が途中で終わっている
  3636.     move.b    (a4)+,d0
  3637.     bsr    do_wrt_cmn_b
  3638.     bra    _sftclp00
  3639. @@:
  3640.     tst.b    d1
  3641.     beq    1f
  3642.     cmpi.b    #'{',d0
  3643.     bne    @f
  3644.     addq.l    #1,d3
  3645.     bra    1f
  3646. @@:
  3647.     cmpi.b    #'}',d0
  3648.     bne    1f
  3649.     subq.l    #1,d3
  3650.     bcs    _exit_sftclp00
  3651. 1:
  3652.     cmpi.b    #$0d,d0            *$0dは無視
  3653.     beq    _sftclp00
  3654.     cmpi.b    #$0a,d0
  3655.     beq    @f
  3656.     bsr    do_wrt_cmn_b
  3657.     bra    _sftclp00
  3658. @@:
  3659.     bsr    cr_line
  3660.     moveq.l    #$0d,d0
  3661.     bsr    do_wrt_cmn_b
  3662.     moveq.l    #$0a,d0
  3663.     bsr    do_wrt_cmn_b
  3664.     tst.b    d1
  3665.     bne    _sftclp00
  3666. _exit_sftclp00:
  3667.     moveq.l    #0,d0
  3668.     bsr    do_wrt_cmn_b
  3669.     movem.l    (sp)+,reglist
  3670.     rts
  3671.  
  3672. set_fn_to_cmn:                *ファイル名をソースより摘出してZMD化
  3673.     * - all                *{}で囲まれている可能性があるケース
  3674. reglist    reg    d0-d3
  3675.     movem.l    reglist,-(sp)
  3676.     bsr    skip_eq
  3677.     cmp.l    a4,d4
  3678.     bls    m_parameter_cannot_be_omitted
  3679.     cmp.b    #'{',(a4)
  3680.     seq    d1
  3681.     bne    @f
  3682.     addq.w    #1,a4
  3683. @@:
  3684.     moveq.l    #0,d3
  3685. sftclp00:
  3686.     cmp.l    a4,d4
  3687.     bls    exit_sftclp01
  3688.     move.b    (a4)+,d0
  3689.     bsr    chk_kanji
  3690.     bpl    @f
  3691.     bsr    do_wrt_cmn_b
  3692.     cmp.l    a4,d4
  3693.     bls    m_kanji_break_off    *漢字が途中で終わっている
  3694.     move.b    (a4)+,d0
  3695.     bsr    do_wrt_cmn_b
  3696.     bra    sftclp00
  3697. @@:
  3698.     cmpi.b    #' ',d0            *ファイル名にスペースはあり得ないから無視
  3699.     beq    sftclp00
  3700.     bhi    @f
  3701.     subq.w    #1,a4            *CTRLコードは戻る
  3702.     bra    exit_sftclp01
  3703. @@:
  3704.     cmp.b    #'{',d0            *始端チェック
  3705.     bne    @f
  3706.     addq.l    #1,d3
  3707. @@:
  3708.     cmp.b    #'}',d0            *終端チェック
  3709.     bne    @f
  3710.     subq.l    #1,d3
  3711.     bcs    exit_sftclp00        *{}ネストまで考慮
  3712. @@:
  3713.     bsr    do_wrt_cmn_b
  3714.     bra    sftclp00
  3715. exit_sftclp00:
  3716.     moveq.l    #0,d1
  3717. exit_sftclp01:
  3718.     bsr    skip_spc
  3719.     tst.b    d1            *'{'はなかった
  3720.     beq    @f
  3721.     bsr    skip_spc
  3722.     cmp.l    a4,d4
  3723.     bls    m_illegal_command_line    *'}'がなかった
  3724.     cmpi.b    #'}',(a4)+
  3725.     bne    m_illegal_command_line    *'}'がなかった
  3726. @@:
  3727.     moveq.l    #0,d0
  3728.     bsr    do_wrt_cmn_b
  3729.     movem.l    (sp)+,reglist
  3730.     rts
  3731.  
  3732. fnstr_chk:            *その文字がファイルネームとして使えるか
  3733.     * < d0.b=data
  3734.     * > eq=can't use
  3735.     * > ne=able to use
  3736.     * - all
  3737.     tst.b    d0
  3738.     bmi    @f
  3739.     movem.l    d0-d1,-(sp)
  3740.     move.l    d0,d1
  3741.     lsr.b    #3,d1
  3742.     ext.w    d1
  3743.     andi.b    #7,d0
  3744.     btst.b    d0,fnstr_tbl(pc,d1.w)
  3745.     movem.l    (sp)+,d0-d1
  3746. @@:
  3747.     rts
  3748.  
  3749. fnstr_tbl:    dc.b    %00000000,%00000000    *00~0f
  3750.         dc.b    %00000000,%00000000    *10~1f
  3751.         dc.b    %01111010,%01000011    *20~2f
  3752.         dc.b    %11111111,%00000111    *30~3f
  3753.         dc.b    %11111111,%11111111    *40~4f
  3754.         dc.b    %11111111,%11010111    *50~5f
  3755.         dc.b    %11111111,%11111111    *60~6f
  3756.         dc.b    %11111111,%11101111    *70~7f
  3757.  
  3758. current_midi_in:            *.CURRENT_MIDI_IN
  3759. *    bsr    check_relation_cmn    *コマンド関係チェック
  3760.     bsr    skip_eq
  3761.     cmp.l    a4,d4
  3762.     bls    m_parameter_cannot_be_omitted
  3763.     cmpi.b    #'{',(a4)
  3764.     seq    d2
  3765.     bne    @f
  3766.     addq.w    #1,a4
  3767. @@:
  3768.     bsr    chk_num
  3769.     bmi    m_parameter_cannot_be_omitted
  3770.     bsr    get_num
  3771.     subq.l    #1,d1            *d1=0-2
  3772.     cmpi.l    #if_max-1,d1
  3773.     bhi    m_illegal_interface_number
  3774.     moveq.l    #CMN_CRNT_MIDI_IN,d0
  3775.     bsr    do_wrt_cmn_b
  3776.     move.l    d1,d0
  3777. *    move.b    d1,cmi_work-work(a6)
  3778.     bsr    do_wrt_cmn_b
  3779.     move.l    zmd_addr-work(a6),a1
  3780.     move.l    z_cmn_flag(a1),d0
  3781.     bset.l    #CMN_CRNT_MIDI_IN/4,d0
  3782.     move.l    d0,z_cmn_flag(a1)
  3783.     tst.b    d2
  3784.     bne    find_end
  3785.     bra    cmpl_lp
  3786.  
  3787. current_midi_out:            *.CURRENT_MIDI_OUT
  3788. *    bsr    check_relation_cmn    *コマンド関係チェック
  3789.     bsr    skip_eq
  3790.     cmp.l    a4,d4
  3791.     bls    m_parameter_cannot_be_omitted
  3792.     cmpi.b    #'{',(a4)
  3793.     seq    d2
  3794.     bne    @f
  3795.     addq.w    #1,a4
  3796. @@:
  3797.     bsr    chk_num
  3798.     bmi    m_parameter_cannot_be_omitted
  3799.     bsr    get_num
  3800.     subq.l    #1,d1            *d1=0-2
  3801.     cmpi.l    #if_max-1,d1
  3802.     bhi    m_illegal_interface_number
  3803.     moveq.l    #CMN_CRNT_MIDI_OUT,d0
  3804.     bsr    do_wrt_cmn_b
  3805.     move.l    d1,d0
  3806. *    move.b    d1,cmo_work-work(a6)
  3807.     bsr    do_wrt_cmn_b
  3808.     move.l    zmd_addr-work(a6),a1
  3809.     move.l    z_cmn_flag(a1),d0
  3810.     bset.l    #CMN_CRNT_MIDI_OUT/4,d0
  3811.     move.l    d0,z_cmn_flag(a1)
  3812.     tst.b    d2
  3813.     bne    find_end
  3814.     bra    cmpl_lp
  3815.  
  3816. dummy:                    *.DUMMY(ダミー)
  3817. *    bsr    check_relation_cmn    *コマンド関係チェック
  3818.     moveq.l    #CMN_DUMMY,d0
  3819.     bsr    do_wrt_cmn_b
  3820.     move.l    zmd_addr-work(a6),a1
  3821.     move.l    z_cmn_flag(a1),d0
  3822.     bset.l    #CMN_DUMMY/4,d0
  3823.     move.l    d0,z_cmn_flag(a1)
  3824.     bra    cmpl_lp
  3825.  
  3826. define:                    *マクロ定義(.define)
  3827.     tst.l    macro_addr-work(a6)
  3828.     bne    @f
  3829.     bsr    get_macro_work    *macro name length(.b),n of param.s(.b),macro name(.str)
  3830. @@:                *macro contents length(.l),macro contents(.str)
  3831.     moveq.l    #0,d1            *d0.l=dummy endcode
  3832.     bsr    get_macro_name        *> d3.b=len of str
  3833.     addq.w    #1,d3            *endcode分
  3834.  
  3835.     moveq.l    #0,d2
  3836. dfnlp00:                *パラメータ個数チェック
  3837.     bsr    skip_spc
  3838.     cmp.l    a4,d4
  3839.     bls    m_illegal_command_line    *中断されている
  3840.     move.b    (a4),d0
  3841.     bsr    chk_kanji
  3842.     bmi    1f
  3843.     cmpi.b    #'%',d0
  3844.     bne    1f
  3845.     addq.w    #1,a4            *skip '%'
  3846.     bsr    chk_num
  3847.     bmi    @f
  3848.     bsr    get_num            *get dummy number
  3849. @@:
  3850.     bsr    skip_sep
  3851.     addq.w    #1,d2
  3852.     cmpi.w    #max_macro_param,d2
  3853.     bhi    m_too_many_parameters
  3854.     bra    dfnlp00
  3855. 1:
  3856.     bsr    skip_spc
  3857.     cmp.l    a4,d4
  3858.     bls    m_illegal_command_line    *中断されている
  3859.     cmpi.b    #'{',(a4)+
  3860.     bne    m_illegal_command_line    *中断されている
  3861.  
  3862.     move.l    macro_now-work(a6),d1        *文字列ポインタ
  3863.     move.l    macro_addr-work(a6),a1
  3864.  
  3865.     bsr    chk_dfn_limit
  3866.     move.b    d3,(a1,d1.l)            *マクロ名の長さ
  3867.     addq.l    #1,d1
  3868.     bsr    chk_dfn_limit
  3869.     move.b    d2,(a1,d1.l)            *パラメータの数
  3870.     addq.l    #1,d1
  3871.  
  3872.     movem.l    d1-d2,-(sp)
  3873.     move.l    temp_buffer-work(a6),a2
  3874.     subq.w    #1,d3            *for dbra
  3875. @@:
  3876.     bsr    chk_dfn_limit
  3877.     move.b    (a2)+,(a1,d1.l)        *マクロ名書き込み
  3878.     addq.l    #1,d1
  3879.     dbra    d3,@b
  3880.  
  3881.     addq.l    #4,d1            *+4はマクロ内容サイズ分
  3882.     bsr    chk_dfn_limit
  3883.  
  3884.     move.l    d1,d5
  3885.  
  3886.     move.l    d1,-(sp)
  3887.     bsr    skip_spc
  3888.     moveq.l    #0,d3
  3889. dfnlp01:                    *マクロ内容登録
  3890.     move.l    a4,line_ptr-work(a6)
  3891.     bsr    chk_dfn_limit
  3892.     cmp.l    a4,d4
  3893.     bls    m_illegal_command_line    *中断されている
  3894.     move.b    (a4)+,d0
  3895.     bsr    chk_kanji
  3896.     bpl    1f
  3897.     move.b    d0,(a1,d1.l)        *漢字1文字目
  3898.     addq.l    #1,d1
  3899.     bsr    chk_dfn_limit
  3900.     cmp.l    a4,d4
  3901.     bls    m_illegal_command_line    *中断されている
  3902.     move.b    (a4)+,d0
  3903.     bra    st_dfn
  3904. 1:
  3905. *    cmpi.b    #'%',d0
  3906. *    bne    1f
  3907. *    subq.b    #1,d2            *パラメータ個数チェック
  3908. *    bcs    m_illegal_parameter_format
  3909. 1:
  3910.     cmpi.b    #'}',d0
  3911.     bne    @f
  3912.     subq.l    #1,d3            *ネスト構造吟味
  3913.     bcs    1f            *exit
  3914. @@:
  3915.     cmpi.b    #'{',d0
  3916.     bne    st_dfn
  3917.     addq.l    #1,d3            *ネスト構造吟味
  3918. st_dfn:
  3919.     move.b    d0,(a1,d1.l)
  3920.     cmpi.b    #$0a,d0
  3921.     bne    @f
  3922.     bsr    cr_line
  3923. @@:
  3924.     addq.l    #1,d1
  3925.     bra    dfnlp01
  3926. 1:
  3927. *    tst.b    d2            *パラメータが個数文無い
  3928. *    bne    m_illegal_parameter_format
  3929.     bsr    chk_dfn_limit
  3930.     clr.b    (a1,d1.l)        *endcode
  3931.     addq.l    #1,d1
  3932.     move.l    d1,d0
  3933.     sub.l    d5,d0
  3934.  
  3935.     move.b    d0,-1(a1,d5.l)        *マクロの内容サイズを登録
  3936.     lsr.l    #8,d0
  3937.     move.b    d0,-2(a1,d5.l)
  3938.     lsr.l    #8,d0
  3939.     move.b    d0,-3(a1,d5.l)
  3940.     lsr.l    #8,d0
  3941.     move.b    d0,-4(a1,d5.l)
  3942. mcrn_reorder:                *並べ変え
  3943.     move.l    macro_now-work(a6),d2
  3944.     move.l    d1,macro_now-work(a6)
  3945.     move.l    d2,d5
  3946.     add.l    a1,d5            *d5.l=limit addr.
  3947.     move.b    2(a1,d2.l),d3        *d3.b=今回登録したマクロの1文字目
  3948.     move.l    d1,d6
  3949.     sub.l    d2,d6            *d0.l=今回の登録内容サイズ
  3950.     move.l    a1,a2
  3951. mcrodr_lp:
  3952.     cmp.b    2(a2),d3
  3953.     bls    @f
  3954.     moveq.l    #0,d0
  3955.     move.b    (a2)+,d0        *d0.b=name len
  3956.     addq.w    #1,a2            *skip (n of param)
  3957.     add.l    d0,a2
  3958.     move.l    a2,d7            *d7.l=name
  3959.     move.b    (a2)+,d0
  3960.     lsl.w    #8,d0
  3961.     move.b    (a2)+,d0
  3962.     swap    d0
  3963.     move.b    (a2)+,d0
  3964.     lsl.w    #8,d0
  3965.     move.b    (a2)+,d0
  3966.     move.l    a2,a3            *a3.l=content
  3967.     add.l    d0,a2
  3968.     cmp.l    a2,d5
  3969.     bne    mcrodr_lp
  3970.     bra    exit_mcrodr
  3971. @@:
  3972.     move.l    a2,a5
  3973. @@:
  3974.     cmp.l    a5,d5            *sentinel case
  3975.     beq    exit_mcrodr        *(連続しているので並べ変える必要はないとする)
  3976.     moveq.l    #0,d0
  3977.     move.b    (a5)+,d0        *d0.b=name len
  3978.     addq.w    #1,a5            *skip (n of param)
  3979.     add.l    d0,a5
  3980.     move.b    (a5)+,d0
  3981.     lsl.w    #8,d0
  3982.     move.b    (a5)+,d0
  3983.     swap    d0
  3984.     move.b    (a5)+,d0
  3985.     lsl.w    #8,d0
  3986.     move.b    (a5)+,d0
  3987.     add.l    d0,a5
  3988.     cmp.b    2(a5),d3
  3989.     beq    @b
  3990.     sub.l    a1,a2            *a2=copy end offset
  3991.     move.l    d1,d2            *d2=copy source offset
  3992.     add.l    d6,d1            *d1=copy dest. offset
  3993.     move.l    d1,-(sp)
  3994.     bsr    chk_dfn_limit
  3995. @@:                    *移動
  3996.     move.b    -1(a1,d2.l),-1(a1,d1.l)
  3997.     subq.l    #1,d1
  3998.     subq.l    #1,d2
  3999.     cmp.l    d2,a2
  4000.     bcs    @b
  4001.     move.l    (sp)+,d1
  4002.     add.l    d6,d2
  4003. @@:                    *今回の内容を定位置にセット
  4004.     move.b    -1(a1,d1.l),-1(a1,d2.l)
  4005.     subq.l    #1,d1
  4006.     subq.l    #1,d2
  4007.     subq.l    #1,d6
  4008.     bne    @b
  4009.     movem.l    (sp)+,d0-d2        *d0-d1はこのケースでは使わない
  4010.     move.l    d7,a1
  4011.     move.l    a3,a2
  4012.     bra    @f
  4013. exit_mcrodr:
  4014.     movem.l    (sp)+,d0-d2
  4015.     lea    (a1,d0.l),a2        *macro contents
  4016.     lea    (a1,d1.l),a1        *macro name
  4017. @@:
  4018.     tst.l    include_depth-work(a6)        *includeしたファイルか
  4019.     bne    cmpl_lp
  4020.  
  4021.     clr.l    macro_now-work(a6)
  4022.  
  4023. *do_chg_src:                *マクロでソースを変換
  4024.     * < d2.l=n of params
  4025.     * < a1.l=macro name str
  4026.     * < a2.l=macro contents str
  4027.     * < a4.l=src addr.
  4028.     * < d4.l=src limiter
  4029.     * - a2
  4030. reglist    reg    d1-d3/d5-d6/a0-a3
  4031.     movem.l    reglist,-(sp)
  4032.     lea    line_backup-work(a6),a0
  4033.     move.l    line_number-work(a6),(a0)+
  4034.     move.l    line_locate-work(a6),(a0)+
  4035.     move.l    line_ptr-work(a6),(a0)+
  4036.     move.l    a4,line_locate-work(a6)
  4037.     move.l    a4,line_ptr-work(a6)
  4038.     move.l    a4,pmr_rvs_start-work(a6)
  4039.     clr.l    pmr_cr-work(a6)
  4040.     move.l    chgsrc_addr-work(a6),d5        *d5=あとで解放するのに使用
  4041.     bsr    get_chgsrc_buffer
  4042.     move.l    chgsrc_addr-work(a6),a3
  4043.     moveq.l    #0,d1
  4044. chgmcrlp00:
  4045.     cmp.l    a4,d4
  4046.     bls    exit_chgsrc
  4047.     move.b    (a4),d0
  4048.     cmpi.b    #'/',d0
  4049.     bne    @f
  4050.     bsr    do_skip_comment
  4051.     bra    chgmcrlp00
  4052. @@:
  4053.     jsr    mk_capital-work(a6)
  4054.     cmp.b    (a1),d0            *マクロ名の1文字目と比較
  4055.     bne    non_chg_src
  4056.     move.l    a4,pmr_ptr0-work(a6)    *マクロ変換開始ポイント
  4057.     bsr    check_macro_name    *文字列検査
  4058.     bmi    non_chg_src        *minus:not match
  4059.     move.l    a4,pmr_ptr1-work(a6)    *マクロ変換開始ポイント
  4060.     move.l    d1,pmr_ofs-work(a6)    *マクロ変換開始ポイント
  4061.                     *パラメータ採りだし
  4062.     move.l    d2,d6
  4063.     movem.l    d2/a0-a2,-(sp)
  4064.     move.l    #4096,d2
  4065.     move.l    #ID_TEMP,d3
  4066.     jsr    get_mem-work(a6)
  4067.     tst.l    d0
  4068.     bmi    m_out_of_memory
  4069.     moveq.l    #0,d3
  4070.     move.w    d3,(a0)            *(endcode=0)*2
  4071.     bsr    skip_spc_mcr
  4072.     subq.w    #1,d6            *for dbra
  4073.     bcs    dochgmcrsrc        *パラメータ無し
  4074. chgmcrlp01:
  4075.     cmp.l    a4,d4
  4076.     bls    m_illegal_command_line    *中断されている
  4077.     move.b    (a4)+,d0
  4078.     bsr    chk_kanji
  4079.     bpl    @f
  4080.     bsr    chk_mcrprm_limit
  4081.     move.b    d0,(a0,d3.l)
  4082.     addq.l    #1,d3
  4083.     cmp.l    a4,d4
  4084.     bls    m_illegal_command_line    *中断されている
  4085.     move.b    (a4)+,d0
  4086.     bra    1f
  4087. @@:
  4088.     cmpi.b    #$0a,d0
  4089.     bne    @f
  4090.     bsr    cr_line
  4091.     bra    1f
  4092. @@:
  4093.     cmpi.b    #',',d0
  4094.     beq    @f
  4095.     cmpi.b    #' ',d0
  4096.     bls    @f
  4097. 1:                    *パラメータ文字列格納
  4098.     bsr    chk_mcrprm_limit
  4099.     move.b    d0,(a0,d3.l)
  4100.     addq.l    #1,d3
  4101.     bra    chgmcrlp01
  4102. @@:                    *パラメータ区切り
  4103.     bsr    chk_mcrprm_limit
  4104.     clr.b    (a0,d3.l)        *end code #1
  4105.     addq.l    #1,d3
  4106.     dbra    d6,chgmcrlp01
  4107.     bsr    chk_mcrprm_limit
  4108.     clr.b    (a0,d3.l)        *end code #2
  4109. dochgmcrsrc:                *マクロ変換
  4110.     move.l    a0,a1            *a1.l(解放時に使用)
  4111.     bsr    preserve_macro_result1    *< d1.l,a3.l
  4112. dochgmcrsrclp:
  4113.     move.b    (a2)+,d0
  4114.     bsr    chk_kanji
  4115.     bpl    @f
  4116.     bsr    chk_chgsrc_limit
  4117.     move.b    d0,(a3,d1.l)
  4118.     addq.l    #1,d1
  4119.     move.b    (a2)+,d0
  4120.     bra    7f
  4121. @@:
  4122.     tst.b    d0
  4123.     beq    exit_dochgmcrsrclp
  4124.     cmpi.b    #'%',d0
  4125.     bne    1f
  4126.     movem.l    d1/d4/a4,-(sp)
  4127.     move.l    a2,a4
  4128.     moveq.l    #-1,d4
  4129.     bsr    chk_num            *%1等の数値付き識別子に対応
  4130.     bmi    6f
  4131.     move.l    a1,a0
  4132.     bsr    get_num
  4133.     move.l    a4,a2
  4134. 2:
  4135.     subq.l    #1,d1
  4136.     bne    3f
  4137. 6:
  4138.     movem.l    (sp)+,d1/d4/a4
  4139.     bra    @f
  4140. 3:
  4141.     tst.b    (a0)
  4142.     beq    5f
  4143. 4:
  4144.     tst.b    (a0)+
  4145.     bne    4b
  4146.     tst.b    (a0)            *まだ残りあり
  4147.     bne    2b
  4148. 5:
  4149.     movem.l    (sp)+,d1/d4/a4        *もうあとがない
  4150.     bra    dochgmcrsrclp
  4151. @@:
  4152.     tst.b    (a0)            *%に対応するパラメータないのでパラメータ置換処理なし
  4153.     beq    dochgmcrsrclp
  4154. @@:                    *%等のキャラクタを実際のパラメータ値へ変換
  4155.     bsr    chk_chgsrc_limit
  4156.     move.b    (a0)+,(a3,d1.l)
  4157.     beq    dochgmcrsrclp
  4158.     addq.l    #1,d1
  4159.     bra    @b
  4160. 1:                    *単に複写
  4161.     cmpi.b    #$0a,d0
  4162.     bne    7f
  4163.     add.l    #1,pmr_cr-work(a6)    *ずれた
  4164. 7:
  4165.     bsr    chk_chgsrc_limit
  4166.     move.b    d0,(a3,d1.l)
  4167.     addq.l    #1,d1
  4168.     bra    dochgmcrsrclp
  4169. exit_dochgmcrsrclp:
  4170.     bsr    preserve_macro_result2    *< d1.l,a3.l
  4171.     jsr    free_mem-work(a6)    *パラメータバッファ解放(< a1.l=ptr)
  4172.     bsr    revise_ln_tbl
  4173.     movem.l    (sp)+,d2/a0-a2
  4174.     bra    chgmcrlp00        *終了
  4175.  
  4176. non_chg_src:                *以下変換しないテキストの場合
  4177.     move.b    (a4)+,d0
  4178.     bsr    chk_kanji
  4179.     bpl    @f
  4180.     bsr    chk_chgsrc_limit
  4181.     move.b    d0,(a3,d1.l)
  4182.     addq.l    #1,d1
  4183.     cmp.l    a4,d4
  4184.     bls    exit_chgsrc
  4185.     move.b    (a4)+,d0
  4186.     bra    1f
  4187. @@:
  4188.     cmpi.b    #$0a,d0
  4189.     bne    1f
  4190.     bsr    cr_line
  4191. 1:
  4192.     bsr    chk_chgsrc_limit
  4193.     move.b    d0,(a3,d1.l)
  4194.     addq.l    #1,d1
  4195.     bra    chgmcrlp00
  4196. exit_chgsrc:
  4197.     bsr    chk_chgsrc_limit
  4198.     clr.b    (a3,d1.l)        *endcode
  4199.  
  4200.     move.l    a3,a4
  4201.     move.l    a4,d4
  4202.     add.l    d1,d4
  4203.     tst.l    d5
  4204.     beq    @f
  4205.     move.l    d5,a1
  4206.     jsr    free_mem-work(a6)
  4207. @@:
  4208.     lea    line_backup-work(a6),a1
  4209.     move.l    (a1)+,d0
  4210.     sub.l    pmr_cr-work(a6),d0
  4211.     move.l    d0,line_number-work(a6)
  4212.     move.l    (a1)+,line_locate-work(a6)
  4213.     move.l    (a1)+,line_ptr-work(a6)
  4214.     movem.l    (sp)+,reglist
  4215.     bra    cmpl_lp
  4216.  
  4217. pmr_len:    equ    4*2+4*3
  4218. reglist    reg    d0-d3/a0-a1
  4219. preserve_macro_result1:
  4220.     * < a3.l=addr
  4221.     * < d1.l=offset
  4222.     movem.l    reglist,-(sp)
  4223.     tst.l    pmr_addr-work(a6)
  4224.     bne    @f
  4225.     move.l    #4096,d2
  4226.     move.l    #ID_TEMP,d3
  4227.     jsr    get_mem-work(a6)
  4228.     tst.l    d0
  4229.     bmi    m_out_of_memory
  4230.     move.l    a0,pmr_addr-work(a6)
  4231.     clr.l    pmr_now-work(a6)
  4232.     move.l    d2,pmr_size-work(a6)
  4233. @@:
  4234.     move.l    pmr_now-work(a6),d2
  4235.     move.l    pmr_addr-work(a6),a1
  4236.     add.l    #pmr_len,d2
  4237.     cmp.l    pmr_size-work(a6),d2
  4238.     bcs    @f
  4239.     add.l    #4096,d2
  4240.     jsr    enlarge_mem-work(a6)
  4241.     tst.l    d0
  4242.     bmi    m_out_of_memory
  4243. @@:
  4244.     lea    -pmr_len(a1,d2.l),a1
  4245.     add.l    a3,d1
  4246.     move.l    d1,(a1)+
  4247.     addq.w    #4,a1            *preserve_macro_result2で埋められる
  4248.     move.l    line_number-work(a6),(a1)+
  4249.     move.l    line_locate-work(a6),(a1)+
  4250.     move.l    pmr_ptr1-work(a6),(a1)+    *マクロ変換開始ポイント
  4251.     movem.l    (sp)+,reglist
  4252.     rts
  4253.  
  4254. preserve_macro_result2:
  4255.     * < a3.l=addr
  4256.     * < d1.l=offset
  4257. reglist    reg    d0-d2/a1
  4258.     movem.l    reglist,-(sp)
  4259.     move.l    line_ptr-work(a6),d0
  4260.     move.l    pmr_now-work(a6),d2
  4261.     move.l    pmr_addr-work(a6),a1
  4262.     add.l    a3,d1
  4263.     move.l    d1,4(a1,d2.l)
  4264.     add.l    #pmr_len,d2
  4265.     move.l    d2,pmr_now-work(a6)
  4266.     movem.l    (sp)+,reglist
  4267.     rts
  4268.  
  4269. get_true_ln:            *マクロ変換によってずれた行番号を補正する
  4270.     * < a4.l=エラー発生アドレス
  4271. reglist    reg    d2/a1
  4272.     movem.l    reglist,-(sp)
  4273.     move.l    pmr_addr-work(a6),a1
  4274.     move.l    pmr_now-work(a6),d2
  4275.     add.l    a1,d2
  4276. 1:
  4277.     cmp.l    d2,a1
  4278.     bcc    exit_gtl
  4279.     cmp.l    (a1),a4
  4280.     bcs    @f
  4281.     cmp.l    4(a1),a4
  4282.     bhi    @f
  4283.     move.l    8(a1),line_number-work(a6)
  4284.     move.l    12(a1),line_locate-work(a6)
  4285.     move.l    16(a1),line_ptr-work(a6)
  4286.     bra    exit_gtl
  4287. @@:
  4288.     lea    pmr_len(a1),a1
  4289.     bra    1b
  4290. exit_gtl:
  4291.     movem.l    (sp)+,reglist
  4292.     rts
  4293.  
  4294. revise_ln_tbl:        *テーブル内のアドレス値の補正
  4295.     * < 変換サイズ=(pmr_ofs)-d1.l
  4296.     * < d4.l=old(src) end
  4297.     * < a3.l=new addr
  4298.     * < a4.l=src ptr
  4299. reglist    reg    d0-d2/a1-a5
  4300.     movem.l    reglist,-(sp)
  4301.     move.l    pmr_ptr0-work(a6),a2
  4302.     move.l    pmr_rvs_start-work(a6),a5
  4303.     move.l    pmr_addr-work(a6),a1
  4304.     move.l    pmr_now-work(a6),d2
  4305.     move.l    pmr_ofs-work(a6),d0
  4306.     sub.l    d0,d1        *d1.l=変換サイズ
  4307.     add.l    a1,d2
  4308. stltlp:
  4309.     cmp.l    d2,a1
  4310.     bcc    exit_stlt
  4311.     cmp.l    (a1),a5
  4312.     bhi    next_stlt
  4313.     cmp.l    4(a1),d4
  4314.     bcs    next_stlt
  4315.     cmp.l    (a1),a2
  4316.     bls    @f
  4317.     move.l    (a1),d0
  4318.     sub.l    a5,d0
  4319.     add.l    a3,d0
  4320.     add.l    d1,d0
  4321.     move.l    d0,(a1)
  4322. @@:
  4323.     cmp.l    4(a1),a4
  4324.     bhi    next_stlt
  4325.     move.l    4(a1),d0
  4326.     sub.l    a5,d0
  4327.     add.l    a3,d0
  4328.     add.l    d1,d0
  4329.     move.l    d0,4(a1)
  4330. next_stlt:
  4331.     lea    pmr_len(a1),a1
  4332.     bra    stltlp
  4333. exit_stlt:
  4334.     movem.l    (sp)+,reglist
  4335.     rts
  4336.  
  4337. skip_spc_mcr:            *スペースをスキップする
  4338.     move.w    d0,-(sp)    *(複数のスペース/タブをスキップ、改行はスキップなし)
  4339. 1:
  4340.     cmp.l    a4,d4
  4341.     bls    @f
  4342.     move.b    (a4),d0
  4343.     cmpi.b    #' ',d0
  4344.     beq    @f
  4345.     bhi    1f
  4346.     cmpi.b    #$0a,d0
  4347.     beq    1f
  4348.     cmpi.b    #$0d,d0
  4349.     beq    1f
  4350.     cmpi.b    #$09,d0
  4351.     bne    1f
  4352. @@:                *skipされるのはSPC&TAB
  4353.     addq.w    #1,a4
  4354.     bsr    chk_mcrprm_limit
  4355.     move.b    d0,(a0,d3.l)
  4356.     addq.l    #1,d3
  4357.     bra    1b
  4358. 1:
  4359.     move.w    (sp)+,d0
  4360.     rts
  4361.  
  4362. consider_macro:                    *溜まっていた変換予定マクロを一気に処理
  4363.     * < a4.l=src addr.
  4364.     * < d4.l=src limiter
  4365.     * - all
  4366. reglist    reg    d0-d3/d5-d7/a0-a3/a5
  4367.     tst.l    include_depth-work(a6)        *includeしたファイルか
  4368.     bne    exit_csdrmcr
  4369.     movem.l    reglist,-(sp)
  4370.     lea    line_backup-work(a6),a0
  4371.     move.l    line_number-work(a6),(a0)+
  4372.     move.l    line_locate-work(a6),(a0)+
  4373.     move.l    line_ptr-work(a6),(a0)+
  4374.     move.l    a4,line_locate-work(a6)
  4375.     move.l    a4,line_ptr-work(a6)
  4376.     move.l    a4,a4_preserve-work(a6)
  4377.     move.l    a4,pmr_rvs_start-work(a6)
  4378.     clr.l    pmr_cr-work(a6)
  4379.     move.l    chgsrc_addr-work(a6),d5        *d5=あとで解放するのに使用
  4380.     bsr    get_chgsrc_buffer
  4381.     move.l    chgsrc_addr-work(a6),a3
  4382.     moveq.l    #0,d1        *d1.l=0の時はまだなにも変換していないというフラグの意味もある
  4383.     bsr    reorder_macro
  4384. _chgmcrlp00:
  4385.     cmp.l    a4,d4
  4386.     bls    _exit_chgsrc
  4387.     move.l    a4,d3
  4388.     moveq.l    #0,d0
  4389.     move.b    (a4),d0
  4390.     cmpi.b    #'/',d0
  4391.     bne    @f
  4392.     bsr    do_skip_comment
  4393.     bra    _chgmcrlp00
  4394. @@:
  4395.     jsr    mk_capital-work(a6)
  4396.     move.l    d0,d2
  4397.     lsl.w    #3,d2
  4398.     move.l    mcrnm_hash_tbl-work(a6),a5
  4399.     move.l    (a5,d2.l),d7        *検索すべき個数
  4400.     beq    2f
  4401.     move.l    4(a5,d2.l),a5
  4402. 1:
  4403.     moveq.l    #0,d6
  4404.     move.b    (a5)+,d6        *name len
  4405.     moveq.l    #0,d2
  4406.     move.b    (a5)+,d2        *d2.l=n of params
  4407.     move.l    a5,a1            *a1.l=name
  4408.     add.l    d6,a5
  4409.     move.b    (a5)+,d6
  4410.     lsl.w    #8,d6
  4411.     move.b    (a5)+,d6
  4412.     swap    d6
  4413.     move.b    (a5)+,d6
  4414.     lsl.w    #8,d6
  4415.     move.b    (a5)+,d6
  4416.     move.l    a5,a2            *a2.l=macro contents
  4417.     add.l    d6,a5
  4418.     cmp.b    (a1),d0            *マクロ名の1文字目と比較
  4419.     bne    @f
  4420.     move.l    a4,pmr_ptr0-work(a6)    *マクロ変換開始ポイント
  4421.     bsr    check_macro_name    *文字列検査
  4422.     bpl    _chgmcr_foundit
  4423. @@:
  4424.     subq.l    #1,d7
  4425.     bne    1b
  4426. 2:
  4427.     bsr    chk_kanji
  4428.     bpl    1f
  4429.     tst.l    d1
  4430.     beq    @f
  4431.     bsr    chk_chgsrc_limit
  4432.     move.b    (a4)+,(a3,d1.l)        *全角コピー
  4433.     addq.l    #1,d1
  4434.     cmp.l    a4,d4
  4435.     bls    m_kanji_break_off
  4436.     bsr    chk_chgsrc_limit
  4437.     move.b    (a4)+,(a3,d1.l)        *全角コピー
  4438.     addq.l    #1,d1
  4439.     bra    _chgmcrlp00        *minus:not match
  4440. @@:
  4441.     addq.w    #2,a4            *全角スキップ
  4442.     bra    _chgmcrlp00        *minus:not match
  4443. 1:
  4444.     tst.l    d1
  4445.     beq    1f
  4446.     bsr    chk_chgsrc_limit
  4447.     move.b    (a4)+,d0
  4448.     cmpi.b    #$0a,d0
  4449.     bne    @f
  4450.     bsr    cr_line
  4451. @@:
  4452.     move.b    d0,(a3,d1.l)        *半角コピー
  4453.     addq.l    #1,d1
  4454.     bra    _chgmcrlp00
  4455. 1:
  4456.     addq.w    #1,a4            *半角スキップ
  4457.     bra    _chgmcrlp00
  4458. _chgmcr_foundit:
  4459.     move.l    a4,pmr_ptr1-work(a6)    *マクロ変換開始ポイント
  4460.     move.l    d1,pmr_ofs-work(a6)    *マクロ変換開始ポイント
  4461.     move.l    a4,d7            *preserve a4
  4462.     move.l    a4_preserve-work(a6),a4
  4463.     cmp.l    a4,d3
  4464.     beq    exit_mcrsrccpylp
  4465.     tst.l    d1            *既に一回やっている
  4466.     bne    exit_mcrsrccpylp
  4467. mcrsrccpylp:
  4468.     move.b    (a4)+,d0
  4469.     bsr    chk_kanji
  4470.     bpl    @f
  4471.     bsr    chk_chgsrc_limit    *その時点までのソースのコピーを作成
  4472.     move.b    d0,(a3,d1.l)
  4473.     addq.l    #1,d1
  4474.     bcs    m_out_of_memory
  4475.     cmp.l    a4,d3
  4476.     beq    m_kanji_break_off
  4477.     move.b    (a4)+,d0
  4478.     bra    1f
  4479. @@:
  4480.     cmpi.b    #$0a,d0
  4481.     bne    1f
  4482.     bsr    cr_line
  4483. 1:
  4484.     bsr    chk_chgsrc_limit
  4485.     move.b    d0,(a3,d1.l)
  4486.     addq.l    #1,d1
  4487.     bcs    m_out_of_memory
  4488.     cmp.l    a4,d3
  4489.     bne    mcrsrccpylp
  4490. exit_mcrsrccpylp:
  4491.     move.l    d7,a4            *get back a4
  4492.  
  4493.     move.l    d2,d6
  4494.     movem.l    d2/a0-a2,-(sp)
  4495.     move.l    #4096,d2        *使い捨て(ルーチン最後に解放)
  4496.     move.l    #ID_TEMP,d3
  4497.     jsr    get_mem-work(a6)
  4498.     tst.l    d0
  4499.     bmi    m_out_of_memory
  4500.     moveq.l    #0,d3
  4501.     move.w    d3,(a0)            *(endcode=0)*2
  4502.     bsr    skip_spc_mcr
  4503.     subq.w    #1,d6            *for dbra
  4504.     bcs    _dochgmcrsrc        *パラメータ無し
  4505. _chgmcrlp01:
  4506.     cmp.l    a4,d4
  4507.     bls    m_illegal_command_line    *中断されている
  4508.     move.b    (a4)+,d0
  4509.     bsr    chk_kanji
  4510.     bpl    @f
  4511.     bsr    chk_mcrprm_limit
  4512.     move.b    d0,(a0,d3.l)
  4513.     addq.l    #1,d3
  4514.     cmp.l    a4,d4
  4515.     bls    m_illegal_command_line    *中断されている
  4516.     move.b    (a4)+,d0
  4517.     bra    1f
  4518. @@:
  4519.     cmpi.b    #$0a,d0
  4520.     bne    @f
  4521.     bsr    cr_line
  4522.     bra    1f
  4523. @@:
  4524.     cmpi.b    #',',d0
  4525.     beq    @f
  4526.     cmpi.b    #' ',d0
  4527.     bls    @f
  4528. 1:                    *パラメータ文字列格納
  4529.     bsr    chk_mcrprm_limit
  4530.     move.b    d0,(a0,d3.l)
  4531.     addq.l    #1,d3
  4532.     bra    _chgmcrlp01
  4533. @@:                    *パラメータ区切り
  4534.     bsr    chk_mcrprm_limit
  4535.     clr.b    (a0,d3.l)        *end code #1
  4536.     addq.l    #1,d3
  4537.     dbra    d6,_chgmcrlp01
  4538.     bsr    chk_mcrprm_limit
  4539.     clr.b    (a0,d3.l)        *end code #2
  4540. _dochgmcrsrc:                *マクロ変換
  4541.     move.l    a0,a1            *a1.l(解放時に使用)
  4542.     bsr    preserve_macro_result1    *< d1.l,a3.l
  4543. _dochgmcrsrclp:
  4544.     move.b    (a2)+,d0
  4545.     bsr    chk_kanji
  4546.     bpl    @f
  4547.     bsr    chk_chgsrc_limit
  4548.     move.b    d0,(a3,d1.l)
  4549.     addq.l    #1,d1
  4550.     move.b    (a2)+,d0
  4551.     bra    7f
  4552. @@:
  4553.     tst.b    d0
  4554.     beq    _exit_dochgmcrsrclp
  4555.     cmpi.b    #'%',d0
  4556.     bne    1f
  4557.     movem.l    d1/d4/a4,-(sp)
  4558.     move.l    a2,a4
  4559.     moveq.l    #-1,d4
  4560.     bsr    chk_num            *%1等の数値付き識別子に対応
  4561.     bmi    6f
  4562.     move.l    a1,a0
  4563.     bsr    get_num
  4564.     move.l    a4,a2
  4565. 2:
  4566.     subq.l    #1,d1
  4567.     bne    3f
  4568. 6:
  4569.     movem.l    (sp)+,d1/d4/a4
  4570.     bra    @f
  4571. 3:
  4572.     tst.b    (a0)
  4573.     beq    5f
  4574. 4:
  4575.     tst.b    (a0)+
  4576.     bne    4b
  4577.     tst.b    (a0)
  4578.     bne    2b
  4579. 5:
  4580.     movem.l    (sp)+,d1/d4/a4
  4581.     bra    _dochgmcrsrclp
  4582. @@:
  4583.     tst.b    (a0)
  4584.     beq    _dochgmcrsrclp
  4585. @@:                    *%等のキャラクタを実際のパラメータ値へ変換
  4586.     bsr    chk_chgsrc_limit
  4587.     move.b    (a0)+,(a3,d1.l)
  4588.     beq    _dochgmcrsrclp
  4589.     addq.l    #1,d1
  4590.     bra    @b
  4591. 1:
  4592.     cmpi.b    #$0a,d0
  4593.     bne    7f
  4594.     add.l    #1,pmr_cr-work(a6)    *ずれた
  4595. 7:
  4596.     bsr    chk_chgsrc_limit
  4597.     move.b    d0,(a3,d1.l)
  4598.     addq.l    #1,d1
  4599.     bra    _dochgmcrsrclp
  4600. _exit_dochgmcrsrclp:
  4601.     bsr    preserve_macro_result2    *< d1.l,a3.l
  4602.     jsr    free_mem-work(a6)    *パラメータバッファ解放(< a1.l=ptr)
  4603.     bsr    revise_ln_tbl
  4604.     movem.l    (sp)+,d2/a0-a2
  4605.     move.l    a4,a4_preserve-work(a6)
  4606.     bra    _chgmcrlp00        *終了
  4607.  
  4608. _exit_chgsrc:
  4609.     tst.l    d1
  4610.     beq    1f            *置換は行われなかった
  4611.     bsr    chk_chgsrc_limit
  4612.     clr.b    (a3,d1.l)        *endcode
  4613.  
  4614.     move.l    a3,a4
  4615.     move.l    a4,d4
  4616.     add.l    d1,d4
  4617.     tst.l    d5
  4618.     beq    @f
  4619.     move.l    d5,a1
  4620.     jsr    free_mem-work(a6)
  4621. @@:
  4622.     lea    line_backup-work(a6),a1
  4623.     move.l    (a1)+,d0
  4624.     sub.l    pmr_cr-work(a6),d0
  4625.     move.l    d0,line_number-work(a6)
  4626.     move.l    (a1)+,line_locate-work(a6)
  4627.     move.l    (a1)+,line_ptr-work(a6)
  4628.     bra    2f
  4629. 1:
  4630.     move.l    a4_preserve-work(a6),a4
  4631. 2:
  4632.     movem.l    (sp)+,reglist
  4633.     clr.l    macro_now-work(a6)
  4634. exit_csdrmcr:
  4635.     rts
  4636.  
  4637. reorder_macro:            *マクロ一覧からハッシュ表を作成
  4638. reglist    reg    d0-d3/d7/a0-a2/a5
  4639.     movem.l    reglist,-(sp)
  4640.     move.l    mcrnm_hash_tbl-work(a6),d0
  4641.     move.l    d0,a0
  4642.     bne    @f
  4643.     move.l    #8*256,d2    *使い捨て(ルーチン最後に解放)
  4644.     move.l    #ID_TEMP,d3
  4645.     jsr    get_mem-work(a6)
  4646.     tst.l    d0
  4647.     bmi    m_out_of_memory
  4648.     move.l    a0,mcrnm_hash_tbl-work(a6)
  4649. @@:
  4650.     move.l    macro_addr-work(a6),d7
  4651.     move.l    d7,a5
  4652.     add.l    macro_now-work(a6),d7
  4653.     moveq.l    #0,d1
  4654. reodrmcr_lp:                *マクロ一覧
  4655.     cmp.l    a5,d7
  4656.     bls    2f
  4657.     move.l    a5,a2
  4658.     moveq.l    #0,d0
  4659.     move.b    (a5)+,d0    *d0.l=macro name length
  4660.     addq.w    #1,a5        *skip n of params
  4661.     move.l    a5,a1        *a1.l=macro name
  4662.     add.l    d0,a5
  4663.     move.b    (a5)+,d0
  4664.     lsl.w    #8,d0
  4665.     move.b    (a5)+,d0
  4666.     swap    d0
  4667.     move.b    (a5)+,d0
  4668.     lsl.w    #8,d0
  4669.     move.b    (a5)+,d0    *d0.l=macro contents length
  4670.     add.l    d0,a5        *a5=next
  4671. @@:
  4672.     cmp.b    (a1),d1
  4673.     beq    count_reodrmcr
  4674.     bhi    allzero_reodrmcr
  4675.     clr.l    (a0)+        *目的のキャラクターになるまでテーブルクリア
  4676.     clr.l    (a0)+
  4677.     addq.b    #1,d1
  4678.     bne    @b
  4679.     bra    exit_reodrmcr
  4680. 2:
  4681.     clr.l    (a0)+        *もうあとがないので後ろは全部クリア
  4682.     clr.l    (a0)+
  4683.     addq.b    #1,d1
  4684.     bne    reodrmcr_lp
  4685. exit_reodrmcr:
  4686.     movem.l    (sp)+,reglist
  4687.     rts
  4688.  
  4689. allzero_reodrmcr:
  4690.     clr.l    (a0)+
  4691.     clr.l    (a0)+
  4692.     addq.b    #1,d1
  4693.     bne    @b
  4694.     bra    exit_reodrmcr
  4695.  
  4696. count_reodrmcr:
  4697.     move.l    a2,4(a0)
  4698.     moveq.l    #1,d2
  4699.     cmp.l    a5,d7
  4700.     bls    @f
  4701. 1:
  4702.     move.l    a5,a2        *preserve hot start 
  4703.     moveq.l    #0,d0
  4704.     move.b    (a5)+,d0    *d0.l=macro name length
  4705.     addq.w    #1,a5        *skip n of params
  4706.     move.l    a5,a1
  4707.     add.l    d0,a5
  4708.     move.b    (a5)+,d0
  4709.     lsl.w    #8,d0
  4710.     move.b    (a5)+,d0
  4711.     swap    d0
  4712.     move.b    (a5)+,d0
  4713.     lsl.w    #8,d0
  4714.     move.b    (a5)+,d0    *d0.l=macro contents length
  4715.     add.l    d0,a5        *a5=next
  4716.     cmp.b    (a1),d1
  4717.     bne    @f
  4718.     addq.l    #1,d2
  4719.     cmp.l    a5,d7
  4720.     bhi    1b
  4721. @@:
  4722.     move.l    d2,(a0)        *個数
  4723.     addq.w    #8,a0
  4724.     addq.b    #1,d1
  4725.     beq    exit_reodrmcr
  4726.     bra    reodrmcr_lp
  4727.  
  4728. check_macro_name:            *実際に文字列を捜す
  4729.     * < a1=source str addr
  4730.     * > eq=get it!
  4731.     * > mi=can't found
  4732.     * - all
  4733.     movem.l    d0-d1/a1,-(sp)
  4734.     move.l    a4,d1        *save a4 to d1
  4735. cmn_lp:
  4736.     cmp.l    a4,d4
  4737.     bls    2f        *途中で終わった
  4738.     move.b    (a4)+,d0
  4739.     bsr    chk_kanji
  4740.     bpl    @f
  4741.     cmp.b    (a1)+,d0
  4742.     bne    2f
  4743.     cmp.l    a4,d4
  4744.     bls    2f        *途中で終わった
  4745.     move.b    (a4)+,d0
  4746.     bra    1f
  4747. @@:
  4748.     jsr    mk_capital-work(a6)    *小文字→大文字
  4749. 1:
  4750.     cmp.b    (a1)+,d0
  4751.     bne    2f
  4752.     tst.b    (a1)        *終了
  4753.     bne    cmn_lp
  4754.     moveq.l    #0,d0        *right!
  4755.     movem.l    (sp)+,d0-d1/a1
  4756.     rts
  4757. 2:
  4758.     move.l    d1,a4        *get back a4
  4759.     moveq.l    #-1,d0        *error!
  4760.     movem.l    (sp)+,d0-d1/a1
  4761.     rts
  4762.  
  4763. chk_mcrprm_limit:        *マクロパラメータ格納バッファ拡張処理
  4764.     cmp.l    d2,d3
  4765.     bcs    @f
  4766.     movem.l    d0/a1,-(sp)
  4767.     move.l    a0,a1
  4768.     add.l    #4096,d2
  4769.     jsr    enlarge_mem-work(a6)
  4770.     tst.l    d0
  4771.     bmi    m_out_of_memory
  4772.     movem.l    (sp)+,d0/a1
  4773. @@:
  4774.     rts
  4775.  
  4776. chk_chgsrc_limit:
  4777.     cmp.l    chgsrc_size-work(a6),d1
  4778.     bcs    @f
  4779.     bsr    spread_chgsrc_buffer
  4780.     move.l    chgsrc_addr-work(a6),a3
  4781. @@:
  4782.     rts
  4783.  
  4784. chk_dfn_limit:
  4785.     cmp.l    macro_size-work(a6),d1
  4786.     bcs    @f
  4787.     bsr    spread_macro_work
  4788.     move.l    macro_addr-work(a6),a1
  4789. @@:
  4790.     rts
  4791.  
  4792. get_macro_work:                *macroワーク確保
  4793.     * > d0.l=tpt_sgcd_max
  4794. reglist    reg    d1-d3/a0-a1
  4795.     movem.l    reglist,-(sp)
  4796.     move.l    #256*10,d2
  4797.     move.l    #ID_TEMP,d3
  4798.     jsr    get_mem-work(a6)
  4799.     tst.l    d0
  4800.     bmi    m_out_of_memory
  4801.     move.l    a0,macro_addr-work(a6)
  4802.     move.l    d2,macro_size-work(a6)    *work limit addr
  4803.     clr.l    macro_now-work(a6)
  4804.     movem.l    (sp)+,reglist
  4805.     rts
  4806.  
  4807. spread_macro_work:            *macroワーク拡張
  4808. reglist    reg    d0-d2/a0-a1
  4809.     movem.l    reglist,-(sp)
  4810.     move.l    macro_addr-work(a6),a1
  4811.     move.l    macro_size-work(a6),d2
  4812.     add.l    #256*10,d2
  4813.     jsr    enlarge_mem-work(a6)
  4814.     tst.l    d0
  4815.     bmi    m_out_of_memory
  4816.     move.l    a0,macro_addr-work(a6)
  4817.     move.l    d2,macro_size-work(a6)    *work limit addr
  4818.     movem.l    (sp)+,reglist
  4819.     rts
  4820.  
  4821. get_chgsrc_buffer:            *変換後のソース格納バッファ確保
  4822.     * > d0.l=tpt_sgcd_max
  4823. reglist    reg    d1-d3/a0-a1
  4824.     movem.l    reglist,-(sp)
  4825.     move.l    #65536,d2
  4826.     move.l    #ID_TEMP,d3
  4827.     jsr    get_mem-work(a6)
  4828.     tst.l    d0
  4829.     bmi    m_out_of_memory
  4830.     move.l    a0,chgsrc_addr-work(a6)
  4831.     move.l    d2,chgsrc_size-work(a6)    *work limit addr
  4832.     movem.l    (sp)+,reglist
  4833.     rts
  4834.  
  4835. spread_chgsrc_buffer:            *変換後のソース格納バッファ拡張
  4836. reglist    reg    d0-d2/a0-a1
  4837.     movem.l    reglist,-(sp)
  4838.     move.l    chgsrc_addr-work(a6),a1
  4839.     move.l    chgsrc_size-work(a6),d2
  4840.     add.l    #65536,d2
  4841.     jsr    enlarge_mem-work(a6)
  4842.     tst.l    d0
  4843.     bmi    m_out_of_memory
  4844.     move.l    a0,chgsrc_addr-work(a6)
  4845.     move.l    d2,chgsrc_size-work(a6)    *work limit addr
  4846.     movem.l    (sp)+,reglist
  4847.     rts
  4848.  
  4849. gxn_len:    equ    240        *文字列最大長
  4850. get_XXX_name    macro    X,Y,MP        *続く文字列(240文字以内)をtemp_bufferに格納する
  4851.     * < MP=0:MACRO,1:PATTERN
  4852.     * < d1.b=end character
  4853.     * > d3.l=文字列長
  4854.     * > d0.b=最後のキャラクター
  4855. reglist    reg    d2/a1
  4856.     movem.l    reglist,-(sp)
  4857.     move.l    temp_buffer-work(a6),a1
  4858.     moveq.l    #0,d2            *始めの位置文字かフラグ [0]=no,$80=yes
  4859.     moveq.l    #0,d3            *str len
  4860.     bsr    skip_spc
  4861. 1:                    *get pattern name
  4862.     cmp.l    a4,d4
  4863.     bls    m_string_break_off
  4864.     .if    (MP=0)
  4865.     tas.b    d2
  4866.     bpl    @f
  4867.     cmpi.b    #'%',(a4)        *マクロ名のあと、' 'なしで%を指定した場合に対応
  4868.     beq    3f
  4869. @@:
  4870.     .endif
  4871.     move.b    (a4)+,d0
  4872.     bsr    chk_kanji
  4873.     bpl    @f
  4874.     move.b    d0,(a1)+        *以下、漢字の場合
  4875.     addq.w    #1,d3
  4876.     cmpi.w    #gxn_len,d3        *gxn_len文字分の識別文字列,1文字分の文字長
  4877.     bhi    X            *パターン名が長すぎます
  4878.     cmp.l    a4,d4
  4879.     bls    m_kanji_break_off    *漢字が途中で終わっている
  4880.     move.b    (a4)+,d0
  4881.     bra    2f
  4882. @@:
  4883.     cmpi.b    #'=',d0
  4884.     bne    @f
  4885.     cmp.b    #'{',d1            *endcodeが'{'の場合か
  4886.     bne    2f
  4887.     cmp.l    a4,d4            *={ は一組で考える
  4888.     bls    m_illegal_command_line
  4889.     cmp.b    (a4),d1
  4890.     bne    2f
  4891.     addq.w    #1,a4            *skip '={'
  4892.     bra    3f
  4893. @@:
  4894.     cmp.b    d1,d0
  4895.     beq    3f
  4896.     cmpi.b    #',',d0
  4897.     beq    3f
  4898.     cmpi.b    #'{',d0            *この文字はパターン名には使用できない
  4899.     beq    m_illegal_character
  4900.     .if    (MP)
  4901.     cmpi.b    #']',d0            *この文字はパターン名には使用できない
  4902.     beq    m_illegal_character
  4903.     .endif
  4904.     cmpi.b    #' ',d0
  4905.     bhi    @f
  4906.     bsr    skip_spc
  4907.     tst.b    d1            *0ならばendcodeチェック省略
  4908.     beq    3f
  4909.     cmp.b    (a4)+,d1
  4910.     bne    m_illegal_command_line
  4911.     bra    3f
  4912. @@:
  4913.     jsr    mk_capital-work(a6)
  4914. 2:
  4915.     move.b    d0,(a1)+
  4916.     addq.w    #1,d3
  4917.     cmpi.w    #gxn_len,d3        *gxn_len文字分の識別文字列,1文字分の文字長
  4918.     bls    1b
  4919.     bra    X            *パターン名が長すぎます
  4920. 3:
  4921.     tst.w    d3
  4922.     beq    Y            *パターン名が省略されている
  4923.     clr.b    (a1)+            *end code
  4924.     movem.l    (sp)+,reglist
  4925.     rts
  4926.     endm
  4927.  
  4928. get_macro_name:
  4929.     get_XXX_name    m_macro_name_too_long,m_macro_name_cannot_be_omitted,0
  4930.  
  4931. secure_ptn_tbl:                    *パターントラック関連ワークの確保
  4932.     move.l    trk_inf_tbl-work(a6),a1        *トラック情報テーブルへの登録
  4933.     move.l    ti_link_offset-work(a6),d0    *リンク・オフセット=0の時は
  4934.     beq    new_gtr_fst_ptn            *だぶりチェック省略
  4935.     move.l    d0,a2
  4936. @@:
  4937.     addq.w    #2,a1
  4938.     move.l    (a1)+,d0
  4939.     beq    new_gtr_ptn        *新規に登録
  4940.     add.l    d0,a1
  4941.     bra    @b
  4942. new_gtr_ptn:                *2回目以降の登録
  4943.     move.l    tit_now-work(a6),d0
  4944.     sub.l    a2,d0
  4945.     add.l    trk_inf_tbl-work(a6),a2
  4946.     move.l    d0,-(a2)        *set link offset
  4947. new_gtr_fst_ptn:            *1回目の登録(link処理無し)
  4948.     moveq.l    #-1,d0
  4949.     bsr    set_tit_w        *register trk no.
  4950.     addq.w    #1,n_of_track-work(a6)    *トラック数増加
  4951.     beq    m_too_many_tracks    *オーバーフロー(トラック数が多すぎる)
  4952.     moveq.l    #0,d0
  4953.     bsr    set_tit_l        *4bytes reserving for offset space
  4954.     move.l    tit_now-work(a6),ti_link_offset-work(a6)    *keep
  4955.     move.l    #ID_PATTERN*256*256*256,d0
  4956.     bsr    set_tit_l        *stat,mode,frq,dummy
  4957.     move.l    #DEV_PATTERN*65536,d0
  4958.     bsr    set_tit_l        *p_type,p_ch
  4959.     moveq.l    #16,d0
  4960.     bsr    set_tit_l        *コメント長=16文字
  4961.     move.l    #'<PAT',d0        *コメント
  4962.     bsr    set_tit_l        *<PATTERN TRACK>,0
  4963.     move.l    #'TERN',d0
  4964.     bsr    set_tit_l
  4965.     move.l    #' TRA',d0
  4966.     bsr    set_tit_l
  4967.     move.l    #'CK>'*256,d0
  4968.     bsr    set_tit_l
  4969.  
  4970.     bsr    get_pattern_tbl
  4971.  
  4972.     moveq.l    #-1,d5                *-1:パターントラック専用トラック番号
  4973.     moveq.l    #0,d6                *トラック精度(1:標準)
  4974.     bra    alloc_trk_buf
  4975.  
  4976. pattern:                    *パターントラック書き込み(.pattern)
  4977.     tst.l    ptn_addr-work(a6)
  4978.     bne    @f
  4979.     bsr    secure_ptn_tbl
  4980. @@:
  4981.     moveq.l    #'{',d1
  4982.     bsr    get_pattern_name        *>d3.b=len of str
  4983.     bsr    find_pattern_name        *パターン名のだぶりチェック
  4984.     bmi    m_pattern_name_redefinition    *パターン名の重複定義
  4985.  
  4986.     move.l    ptn_addr-work(a6),a1
  4987.     move.l    ptn_size-work(a6),d2
  4988.     cmp.l    ptn_now-work(a6),d2
  4989.     bhi    @f
  4990.     bsr    spread_pattern_tbl
  4991. @@:
  4992.     move.l    ptn_now-work(a6),d0
  4993.     lea    (a1,d0.l),a2            *a2.l=新規登録アドレス
  4994.     moveq.l    #0,d5
  4995.     bsr    chk_num    
  4996.     bmi    @f
  4997.     bsr    get_num
  4998.     cmpi.l    #255,d1
  4999.     bhi    m_illegal_track_frequency
  5000.     move.l    d1,d5
  5001. @@:
  5002.     moveq.l    #-1,d1
  5003.     bsr    set_current_trk        *カレントトラックを「パターントラック」にする
  5004.     move.l    current_trk_ptr-work(a6),a5
  5005.     move.l    a2,tpt_ptn_work(a5)    *パターンサイズを計算する時に使う
  5006.     move.l    tpt_now(a5),(a2)+    *offsetアドレスセット
  5007.     move.w    #128,tpt_trkvol(a5)    *!97/5/19
  5008.     bsr    init_compile_work    *ワーク初期化
  5009.     addq.w    #4,a2            *今回のパターンサイズ格納アドレス分スキップ
  5010.     move.w    d5,tpt_trkfrq(a5)    *track frequency
  5011.     move.l    temp_buffer-work(a6),a1
  5012.     move.b    d3,(a2)+        *文字長
  5013.     subq.w    #1,d3
  5014. @@:
  5015.     move.b    (a1)+,(a2)+        *パターン名書き込み
  5016.     dbra    d3,@b
  5017.     bsr    skip_spc
  5018.     addq.l    #1,n_of_ptn-work(a6)
  5019.     add.l    #256,ptn_now-work(a6)
  5020.     st.b    ptn_cmd-work(a6)
  5021.     bra    go_mml_cmpl
  5022.  
  5023. get_pattern_tbl
  5024.     movem.l    d0/d2-d3/a0,-(sp)
  5025.     move.l    #256*10,d2                *パターン管理バッファ確保
  5026.     move.l    #ID_TEMP,d3            *最初は10個分
  5027.     jsr    get_mem-work(a6)        *offset.l,length(b),string....:total:256
  5028.     tst.l    d0
  5029.     bmi    m_out_of_memory
  5030.     move.l    a0,ptn_addr-work(a6)
  5031.     move.l    d2,ptn_size-work(a6)
  5032.     moveq.l    #0,d0
  5033.     move.l    d0,ptn_now-work(a6)
  5034.     move.l    d0,n_of_ptn-work(a6)
  5035.     movem.l    (sp)+,d0/d2-d3/a0
  5036.     rts
  5037.  
  5038. spread_pattern_tbl:
  5039.     * < a1.l=old ptn_addr
  5040.     * < d2.l=old ptn_size
  5041.     * > a1.l=new ptn_addr
  5042.     * > d2.l=new ptn_size
  5043.     movem.l    d0/a0,-(sp)
  5044.     add.l    #256*10,d2            *10個追加
  5045.     jsr    enlarge_mem-work(a6)
  5046.     tst.l    d0
  5047.     bmi    m_out_of_memory
  5048.     move.l    a0,ptn_addr-work(a6)
  5049.     move.l    d2,ptn_size-work(a6)        *new work limit
  5050.     move.l    a0,a1
  5051.     movem.l    (sp)+,d0/a0
  5052.     rts
  5053.  
  5054. get_pattern_name:
  5055.     get_XXX_name    m_pattern_name_too_long,m_pattern_name_cannot_be_omitted,1
  5056.  
  5057. find_pattern_name:            *パターン名の検索
  5058.     * > ne    :hit!(>a2.l=exact address)
  5059.     * > zero:miss
  5060.     * - all
  5061.     movem.l    d0-d1/a1,-(sp)
  5062.     move.l    ptn_addr-work(a6),d2
  5063.     move.l    n_of_ptn-work(a6),d1        *d1=number of pattern(1-?)
  5064.     beq    exit_fndptnnm
  5065.     move.l    d2,a2
  5066. mlptnlp00:
  5067.     move.l    a2,d2            *copy
  5068.     move.l    temp_buffer-work(a6),a1
  5069.     addq.l    #8,a2            *(オフセットアドレス+サイズ格納領域)分飛ばす
  5070.     moveq.l    #0,d5
  5071.     move.b    (a2)+,d5
  5072.     subq.w    #1,d5            *for dbra
  5073. mlptnlp01:
  5074.     move.b    (a1)+,d0
  5075.     bsr    chk_kanji
  5076.     bpl    @f
  5077.     cmp.b    (a2)+,d0
  5078.     bne    2f
  5079.     subq.w    #1,d5            *for dbra
  5080.     bmi    2f
  5081.     move.b    (a1)+,d0
  5082.     bra    1f
  5083. @@:
  5084.     jsr    mk_capital-work(a6)
  5085. 1:
  5086.     cmp.b    (a2)+,d0
  5087.     bne    2f
  5088.     dbra    d5,mlptnlp01        *テーブルに格納されている文字列をすべて比較して等しく
  5089.     tst.b    (a1)+            *なおかつ被比較文字列の終端がゼロならば文字列一致
  5090.     beq    exit_fndptnnm        *検索パターン発見
  5091. 2:
  5092.     move.l    d2,a2
  5093.     lea    256(a2),a2
  5094.     subq.l    #1,d1
  5095.     bne    mlptnlp00
  5096. exit_fndptnnm:
  5097.     move.l    d1,d0            *ここでCCRにneかzeroを設定
  5098.     move.l    d2,a2
  5099.     movem.l    (sp)+,d0-d1/a1
  5100.     rts
  5101.  
  5102. print:                    *.PRINT(コメント文)
  5103. *    bsr    check_relation_cmn    *コマンド関係チェック
  5104.     moveq.l    #CMN_PRINT,d0
  5105.     bsr    do_wrt_cmn_b
  5106.     bsr    set_cmt_to_cmn        *文字列のZMD化
  5107.     move.l    zmd_addr-work(a6),a1
  5108.     move.l    z_cmn_flag(a1),d0
  5109.     bset.l    #CMN_PRINT/4,d0
  5110.     move.l    d0,z_cmn_flag(a1)
  5111.     bra    cmpl_lp
  5112.  
  5113. tempo:                    *.TEMPO
  5114. *    bsr    check_relation_cmn    *コマンド関係チェック
  5115.     moveq.l    #0,d2
  5116.     bsr    chk_num
  5117.     bpl    @f
  5118.     bsr    skip_eq
  5119.     cmp.l    a4,d4
  5120.     bls    m_parameter_cannot_be_omitted
  5121.     cmpi.b    #'{',(a4)+
  5122.     seq    d2
  5123.     bne    m_parameter_cannot_be_omitted
  5124.     bsr    chk_num
  5125.     bmi    m_parameter_cannot_be_omitted
  5126. @@:
  5127.     bsr    get_num
  5128.     cmpi.l    #65535,d1
  5129.     bhi    m_tempo_command_error
  5130.     bra    @f
  5131. t_tempo:                *(On)テンポ設定
  5132.     moveq.l    #1,d2            *終端カッコチェックの有無フラグ(1:checkあり)
  5133. *    bsr    check_relation_cmn    *コマンド関係チェック
  5134.     bsr    chk_num
  5135.     bmi    m_parameter_cannot_be_omitted
  5136.     bsr    get_num
  5137.     cmpi.l    #65535,d1
  5138.     bhi    m_tempo_command_error
  5139. @@:
  5140.     move.l    zmd_addr-work(a6),a1
  5141.     move.w    d1,z_tempo(a1)        *情報ブロックにも書き込む
  5142.     tst.b    d2
  5143.     bne    find_end
  5144.     bra    cmpl_lp
  5145.  
  5146. track:                    *トラック書き込み(.track)
  5147. *    bsr    check_relation_cmn    *コマンド関係チェック
  5148.     move.l    t_trk_no-work(a6),a1
  5149.     moveq.l    #t_trk_no_max-1,d2
  5150. trklp:                    *トラック番号複数記述に対応
  5151.     bsr    chk_num
  5152.     bpl    @f
  5153.     bsr    srch_num
  5154.     bmi    go_trkcmpl
  5155. @@:
  5156.     bsr    get_trknum_seq
  5157.     dbra    d2,trklp
  5158.     bra    m_track_command_error    *tr_max個以上設定している
  5159. *-----------------------------------------------------------------------------
  5160. t_trk:                    *トラック書き込み(tN)
  5161. *    bsr    check_relation_cmn    *コマンド関係チェック
  5162.     move.l    t_trk_no-work(a6),a1
  5163.     moveq.l    #t_trk_no_max-1,d2
  5164.     moveq.l    #0,d3
  5165. ttrlp:                    *トラック番号複数記述に対応
  5166.     bsr    chk_num
  5167.     bmi    go_trkcmpl
  5168.     bsr    get_trknum_seq
  5169.     dbra    d2,ttrlp
  5170.     bra    m_track_command_error    *tr_max個以上設定している
  5171.  
  5172. get_trknum_seq:                *トラック番号並び取り出し
  5173.     bsr    get_num
  5174.     tst.l    d1
  5175.     bmi    @f
  5176.     subq.l    #1,d1
  5177.     cmpi.l    #tr_max-1,d1
  5178.     bhi    m_illegal_track_number
  5179.     move.l    d1,d3
  5180.     move.w    d1,(a1)+
  5181.     move.w    #-1,(a1)        *endcode
  5182.     bra    2f
  5183. @@:
  5184.     neg.l    d1
  5185.     subq.l    #1,d1
  5186.     cmpi.l    #tr_max-1,d1
  5187.     bhi    m_illegal_track_number
  5188. 1:
  5189.     cmp.w    d1,d3            *(t1-1)のようなケース
  5190.     beq    2f
  5191.     subq.w    #1,d2
  5192.     bcs    m_track_command_error    *tr_max個以上設定している
  5193.     move.w    d1,(a1)+
  5194.     move.w    #-1,(a1)        *endcode
  5195.     cmp.w    d1,d3
  5196.     bhi    @f
  5197.     subq.w    #1,d1
  5198.     bra    1b
  5199. @@:
  5200.     addq.w    #1,d1
  5201.     bra    1b
  5202. 2:
  5203.     bra    skip_sep
  5204.  
  5205. go_trkcmpl:
  5206.     move.l    t_trk_no-work(a6),a1
  5207.     moveq.l    #0,d1
  5208.     move.w    (a1)+,d1
  5209.     cmpi.w    #-1,d1                *1つも書き込み先トラックが指定されて
  5210.     beq    m_parameter_cannot_be_omitted    *いないのならばエラー
  5211.     bsr    skip_spc        *以下find_endと同等の処理
  5212.     tst.b    now_cmd-work(a6)
  5213.     bmi    @f            *.trackコマンドならば終端記号は無し
  5214.     cmp.l    a4,d4
  5215.     bls    m_illegal_command_line
  5216.     cmpi.b    #')',(a4)+        *(tN)
  5217.     bne    m_illegal_command_line    *   ^
  5218.     bra    do_trkcmpl
  5219. @@:
  5220.     bsr    skip_eq
  5221.     cmp.l    a4,d4
  5222.     bls    m_illegal_command_line
  5223.     cmpi.b    #'{',(a4)+        *.track    N {
  5224.     bne    m_illegal_command_line    *         ^
  5225. do_trkcmpl:
  5226.     move.l    sp,sp_buf-work(a6)    *スタック保存
  5227.     bclr.b    #1,now_cmd-work(a6)    *まずは「MMLコンパイルでない」として初期化
  5228.     bsr    set_current_trk        *書き込みトラックの選択(< d1 track number)
  5229. go_mml_cmpl:
  5230.     or.b    #%0000_0011,now_cmd-work(a6)    *MMLコンパイルしてます,1ライン単位コンパイル
  5231.     move.l    current_trk_ptr-work(a6),a5
  5232.     lea    line_backup-work(a6),a2
  5233.     move.l    line_number-work(a6),(a2)+
  5234.     move.l    line_locate-work(a6),(a2)+
  5235.     move.l    line_ptr-work(a6),(a2)+
  5236.     move.l    n_of_err-work(a6),(a2)+
  5237.     move.l    tpt_now(a5),d1
  5238.     movem.l    d1/a1/a4,-(sp)        *保存個数を変えたらzcerror.hasの方(go_compile_endなど)
  5239. mml_lp_sp_depth:    equ    3    *も変更する
  5240.     move.l    sp,sp_buf-work(a6)    *スタック保存
  5241.     clr.b    warn_flg-work(a6)    *ON
  5242. mml_lp:
  5243.     move.l    a4,d7            *戻る場合があるのでとりあえず保存
  5244.     clr.b    seq_cmd-work(a6)    *[]系コマンドフラグOFF
  5245.     bsr    skip_spc2        *改行までスキップしない
  5246.     cmp.l    a4,d4
  5247.     bls    mmlc_exit
  5248.     move.b    (a4)+,d0
  5249.     beq    mmlc_exit        *data end
  5250.     bsr    chk_kanji
  5251.     bpl    @f
  5252.                     *全角スキップ
  5253.     cmp.l    a4,d4            *1バイト目でファイル終端にきていないかチェック
  5254.     bls    m_kanji_break_off
  5255.     addq.w    #1,a4            *全角の2バイト目をスキップ
  5256.     bra    mml_lp
  5257. @@:
  5258.     jsr    mk_capital-work(a6)    *d0がalphabetなら大文字にして
  5259.     moveq.l    #0,d1
  5260.     move.b    d0,d1
  5261.     subi.b    #$41,d1        *'A'を引いて
  5262.     bmi    not_alpha_cmd    *英字以外のコマンド
  5263.     cmpi.b    #25,d1
  5264.     bhi    not_alpha_cmd
  5265.     btst.b    #c_break,tpt_mode_flg(a5)    *コンパイル中断フラグチェック
  5266.     bne    go_skip_mml
  5267.     add.w    d1,d1
  5268.     move.w    mml_cnv_jmp(pc,d1.w),a2
  5269.     jmp    mml_cnv_jmp(pc,a2.w)
  5270.  
  5271. mml_cnv_jmp:            *jump table
  5272.     dc.w    mml_ag-mml_cnv_jmp    *音階
  5273.     dc.w    mml_ag-mml_cnv_jmp    *音階
  5274.     dc.w    mml_ag-mml_cnv_jmp    *音階
  5275.     dc.w    mml_ag-mml_cnv_jmp    *音階
  5276.     dc.w    mml_ag-mml_cnv_jmp    *音階
  5277.     dc.w    mml_ag-mml_cnv_jmp    *音階
  5278.     dc.w    mml_ag-mml_cnv_jmp    *音階
  5279.     dc.w    mml_h-mml_cnv_jmp    *モジュレーションホールド
  5280.     dc.w    mml_i-mml_cnv_jmp    *バンクセレクト
  5281.     dc.w    mml_j-mml_cnv_jmp    *強制再演奏
  5282.     dc.w    mml_k-mml_cnv_jmp    *キートランスポーズ
  5283.     dc.w    mml_l-mml_cnv_jmp    *音長
  5284.     dc.w    mml_m-mml_cnv_jmp    *モジュレーションモード
  5285.     dc.w    mml_n-mml_cnv_jmp    *チャンネルアサイン
  5286.     dc.w    mml_o-mml_cnv_jmp    *オクターブ
  5287.     dc.w    mml_p-mml_cnv_jmp    *パン
  5288.     dc.w    mml_q-mml_cnv_jmp    *ゲートタイム
  5289.     dc.w    mml_r-mml_cnv_jmp    *休符
  5290.     dc.w    mml_s-mml_cnv_jmp    *波形セレクト
  5291.     dc.w    mml_t-mml_cnv_jmp    *テンポ
  5292.     dc.w    mml_u-mml_cnv_jmp    *ベロシティ
  5293.     dc.w    mml_v-mml_cnv_jmp    *ボリューム
  5294.     dc.w    mml_w-mml_cnv_jmp    *同期
  5295.     dc.w    mml_x-mml_cnv_jmp    *ローランドエクスクルーシブ
  5296.     dc.w    mml_y-mml_cnv_jmp    *Yコマンド
  5297.     dc.w    mml_z-mml_cnv_jmp    *Zコマンド
  5298.  
  5299. not_alpha_cmd:            *アルファベット以外のコマンド
  5300.     cmpi.b    #'}',d0        *連符エンド(またはコンパイル終了)
  5301.     beq    renp_end
  5302.     cmpi.b    #'(',d0        *portament
  5303.     beq    mml_port
  5304.     cmpi.b    #'[',d0        *special seq. cmd
  5305.     beq    mml_seq_command
  5306.     cmpi.b    #' ',d0
  5307.     bls    case_lower_chr
  5308.     btst.b    #c_break,tpt_mode_flg(a5)    *コンパイル中断フラグチェック
  5309.     bne    go_skip_mml
  5310.     cmpi.b    #'/',d0
  5311.     bne    @f
  5312. go_skip_mml:
  5313.     bsr    do_skip_comment    *コメント行をスキップ
  5314.     bra    mml_lp
  5315. @@:
  5316.     cmp.b    #OCTAVE_UP,d0    *octave up
  5317.     beq    oct_up
  5318.     cmp.b    #OCTAVE_DOWN,d0    *octave down
  5319.     beq    oct_dwn
  5320.     cmpi.b    #'{',d0        *連符スタート
  5321.     beq    renp_start
  5322.     cmpi.b    #'@',d0        *@ commands
  5323.     beq    cmd_@
  5324.     cmpi.b    #'|',d0        *repeat command
  5325.     beq    mml_rept_start
  5326.     cmpi.b    #':',d0        *repeat start or end
  5327.     beq    mml_rept_end
  5328.     cmpi.b    #';',d0        *ZMD直接書き込み
  5329.     beq    mml_direct_zmd
  5330.     cmpi.b    #"'",d0        *和音コマンド
  5331.     beq    mml_chord
  5332.     cmpi.b    #'_',d0        *相対ボリューム down
  5333.     beq    mml_rltv_vol_dwn
  5334.     cmpi.b    #'~',d0        *相対ボリューム up
  5335.     beq    mml_rltv_vol_up
  5336.     cmpi.b    #'`',d0        *強制キーオフ
  5337.     beq    mml_kill_note
  5338.     cmpi.b    #'=',d0        *特殊コマンドスイッチ
  5339.     beq    mml_switch
  5340.     cmpi.b    #'\',d0        *fader ctrl
  5341.     beq    mml_fader_v2
  5342.     cmpi.b    #'?',d0        *poke command
  5343.     beq    mml_poke
  5344.     cmpi.b    #'"',d0        *スペシャル・タイ・モード
  5345.     beq    mml_@j
  5346.     cmpi.b    #'.',d0
  5347.     beq    goback_cmn_cmpl
  5348.     bra    m_syntax_error    *文法エラー
  5349.  
  5350. goback_cmn_cmpl:
  5351.     tst.b    now_cmd-work(a6)
  5352.     bmi    m_syntax_error    *文法エラー(.trackコマンドなのに '}'がないのはおかしい)
  5353.     subq.w    #1,a4
  5354.     bra    mmlc_exit
  5355.  
  5356. case_lower_chr:            *' '以下のキャラクタケース
  5357.     cmpi.b    #$0a,d0
  5358.     bne    mml_lp
  5359.     bsr    cr_line        *改行して次の行もコンパイル
  5360.     tst.b    now_cmd-work(a6)
  5361.     bmi    mml_lp
  5362.     bsr    skip_spc2        *改行までスキップしない
  5363.     cmp.l    a4,d4
  5364.     bls    mmlc_exit
  5365.     move.b    (a4),d0
  5366.     cmpi.b    #'.',d0
  5367.     beq    mmlc_exit
  5368.     cmpi.b    #'#',d0
  5369.     beq    mmlc_exit
  5370. *    cmpi.b    #'(',d0
  5371. *    beq    mmlc_exit
  5372.     bra    mml_lp
  5373.  
  5374. mmlc_exit:
  5375.     btst.b    #c_renp1,tpt_mode_flg(a5)
  5376.     bne    m_group_notes_command_error    *連符処理中に帰還はできない
  5377.     movem.l    (sp)+,d1/a1-a2
  5378.     tst.b    ptn_cmd-work(a6)
  5379.     bne    mmlc_exit_ptn        *パターン設定だった
  5380.     moveq.l    #0,d1
  5381.     move.w    (a1)+,d1        *同時書き込みトラック番号取得
  5382.     cmpi.w    #-1,d1
  5383.     beq    cmpl_lp
  5384.     move.l    n_of_err-work(a6),d0
  5385.     cmp.l    line_backup+12-work(a6),d0
  5386.     bne    cmpl_lp            *エラーがあるならばコンパイルはしない
  5387.     move.l    line_backup+8-work(a6),line_ptr-work(a6)
  5388.     move.l    line_backup+4-work(a6),line_locate-work(a6)
  5389.     move.l    line_backup+0-work(a6),line_number-work(a6)
  5390.     move.l    a2,a4
  5391.     bra    do_trkcmpl
  5392.  
  5393. mmlc_exit_ptn:            *パターントラック書き込みの終了ケース
  5394.     * < d1.l=mml_lp突入前のtpt_now(a5)
  5395.     move.l    tpt_now(a5),d2
  5396.     cmp.l    d2,d1
  5397.     beq    m_null_pattern_error    *パターントラックの「空」はだめ
  5398.     move.l    tpt_ptn_work(a5),a2
  5399.     sub.l    (a2)+,d2    *パターントラック書き込み前のアドレスと減算してサイズを求める
  5400.     move.l    d2,(a2)+    *サイズ格納
  5401.     moveq.l    #return_zmd,d0
  5402.     bsr    do_wrt_trk_b    *リターンコードセット
  5403.     clr.b    ptn_cmd-work(a6)
  5404.     bra    cmpl_lp
  5405.  
  5406. mml_p:                *パンポット command P
  5407.     bsr    chk_num
  5408.     bmi    m_parameter_cannot_be_omitted
  5409.     bsr    get_num
  5410.     cmpi.l    #3,d1
  5411.     bhi    m_illegal_panpot_value
  5412.     moveq.l    #panpot_zmd,d0
  5413.     bsr    do_wrt_trk_b    *panpot code
  5414.     move.b    mmlptbl(pc,d1.w),d0    *0-127レンジへ変換
  5415.     bsr    do_wrt_trk_b    *panpot code
  5416.     bra    mml_lp
  5417. mmlptbl:
  5418.     dc.b    128,0,127,64
  5419. *-----------------------------------------------------------------------------
  5420. mml_slot_separation:            *[SLOT_SEPARATION]
  5421.     bsr    chk_num
  5422.     bpl    @f
  5423.     lea    sltmsk_strv-work(a6),a1
  5424.     bsr    get_com_no
  5425.     bmi    m_illegal_mode_value    *規定外
  5426.     move.l    d0,d1
  5427.     bra    1f
  5428. @@:
  5429.     bsr    get_num
  5430.     cmp.l    #%1111,d1
  5431.     bhi    m_illegal_mode_value    *規定外
  5432. 1:
  5433.     moveq.l    #slot_mask_zmd,d0
  5434.     bsr    do_wrt_trk_b
  5435.     lsl.b    #3,d1
  5436.     move.l    d1,d0            *mode value
  5437.     bra    do_wrt_trk_b
  5438. *-----------------------------------------------------------------------------
  5439. mml_opm_lfo:                *[OPM.LFO]
  5440.     bsr    chk_num            *まずは波形番号とりだし
  5441.     bpl    mol_wf_num
  5442.     lea    opm_wf_name-work(a6),a1
  5443.     bsr    get_com_no
  5444.     bmi    @f
  5445.     move.l    d0,d1
  5446.     bra    set_mol_wf
  5447. @@:
  5448.     cmp.l    a4,d4
  5449.     bls    m_illegal_command_line
  5450.     cmpi.b    #',',(a4)
  5451.     beq    get_mol_sync
  5452.     bra    m_illegal_command_line
  5453. mol_wf_num:
  5454.     bsr    get_num
  5455.     cmpi.l    #3,d1            *波形番号異常
  5456.     bhi    m_illegal_wave_number
  5457. set_mol_wf:
  5458.     moveq.l    #opm_regset_zmd,d0    *cmd
  5459.     bsr    do_wrt_trk_b
  5460.     moveq.l    #$80+09,d0        *WF
  5461.     bsr    do_wrt_trk_b
  5462.     move.l    d1,d0            *value
  5463.     bsr    do_wrt_trk_b
  5464. get_mol_sync:
  5465.     bsr    skip_sep
  5466.     bsr    chk_num            *シンクロ
  5467.     bpl    mol_syc_num
  5468.     lea    switch_strv-work(a6),a1
  5469.     bsr    get_com_no
  5470.     bmi    @f
  5471.     move.l    d0,d1
  5472.     bra    set_mol_syc
  5473. @@:
  5474.     cmp.l    a4,d4
  5475.     bls    m_illegal_command_line
  5476.     cmpi.b    #',',(a4)
  5477.     beq    get_mol_spd
  5478.     bra    m_illegal_command_line
  5479. mol_syc_num:
  5480.     bsr    get_num
  5481.     cmpi.l    #1,d1            *同期モード値異常
  5482.     bhi    m_illegal_switch_value
  5483. set_mol_syc:
  5484.     moveq.l    #poke_zmd,d0        *cmd
  5485.     bsr    do_wrt_trk_b
  5486.     moveq.l    #$10,d0            *omt(addr.w,data.b)
  5487.     bsr    do_wrt_trk_b
  5488.     move.w    #p_sync,d0        *addr. offset
  5489.     bsr    do_wrt_trk_w
  5490.     move.l    d1,d0            *data value
  5491.     bsr    do_wrt_trk_b
  5492. get_mol_spd:
  5493.     bsr    skip_sep
  5494.     bsr    chk_num
  5495.     bmi    @f
  5496.     bsr    get_num
  5497.     cmpi.l    #255,d1
  5498.     bhi    m_illegal_speed_value
  5499.     moveq.l    #opm_regset_zmd,d0    *cmd
  5500.     bsr    do_wrt_trk_b
  5501.     moveq.l    #$80+06,d0        *SPD
  5502.     bsr    do_wrt_trk_b
  5503.     move.l    d1,d0            *value
  5504.     bsr    do_wrt_trk_b
  5505. @@:
  5506.     bsr    skip_sep
  5507.     bsr    chk_num
  5508.     bmi    @f
  5509.     bsr    get_num
  5510.     cmpi.l    #127,d1
  5511.     bhi    m_illegal_depth_value
  5512.     moveq.l    #opm_regset_zmd,d0    *cmd
  5513.     bsr    do_wrt_trk_b
  5514.     moveq.l    #$80+07,d0        *PMD
  5515.     bsr    do_wrt_trk_b
  5516.     move.l    d1,d0            *value
  5517.     bsr    do_wrt_trk_b
  5518. @@:
  5519.     bsr    skip_sep
  5520.     bsr    chk_num
  5521.     bmi    @f
  5522.     bsr    get_num
  5523.     cmpi.l    #127,d1
  5524.     bhi    m_illegal_depth_value
  5525.     moveq.l    #opm_regset_zmd,d0    *cmd
  5526.     bsr    do_wrt_trk_b
  5527.     moveq.l    #$80+08,d0        *AMD
  5528.     bsr    do_wrt_trk_b
  5529.     move.l    d1,d0            *value
  5530.     bsr    do_wrt_trk_b
  5531. @@:
  5532.     bsr    skip_sep
  5533.     bsr    chk_num
  5534.     bmi    @f
  5535.     bsr    get_num
  5536.     cmpi.l    #7,d1
  5537.     bhi    m_illegal_depth_value
  5538.     moveq.l    #opm_regset_zmd,d0    *cmd
  5539.     bsr    do_wrt_trk_b
  5540.     moveq.l    #$80+14,d0        *PMS
  5541.     bsr    do_wrt_trk_b
  5542.     move.l    d1,d0            *value
  5543.     bsr    do_wrt_trk_b
  5544. @@:
  5545.     bsr    skip_sep
  5546.     bsr    chk_num
  5547.     bmi    @f
  5548.     bsr    get_num
  5549.     cmpi.l    #3,d1
  5550.     bhi    m_illegal_depth_value
  5551.     moveq.l    #opm_regset_zmd,d0    *cmd
  5552.     bsr    do_wrt_trk_b
  5553.     moveq.l    #$80+13,d0        *AMS
  5554.     bsr    do_wrt_trk_b
  5555.     move.l    d1,d0            *value
  5556.     bra    do_wrt_trk_b
  5557.  
  5558. mml_opm:                *[OPM]
  5559.     lea    opm_op_name-work(a6),a1
  5560.     bsr    get_com_no
  5561.     bpl    1f
  5562.     lea    opm_op_name2-work(a6),a1
  5563.     bsr    get_com_no
  5564.     bpl    1f
  5565.     lea    opm_reg_name-work(a6),a1
  5566.     bsr    get_com_no
  5567.     bpl    _4x_mmlopm
  5568.     lea    opm_reg_name2-work(a6),a1
  5569.     bsr    get_com_no
  5570.     bpl    _4x_mmlopm
  5571.     lea    opm_reg_name3-work(a6),a1
  5572.     bsr    get_com_no
  5573.     bpl    _4x_mmlopm
  5574.     bra    m_unknown_register_name
  5575. 1:
  5576.     move.l    d0,d2
  5577.     cmpi.w    #3,d0
  5578.     bhi    1f
  5579.     lea    opm_reg_name-work(a6),a1
  5580.     bsr    get_com_no
  5581.     bpl    @f
  5582.     lea    opm_reg_name2-work(a6),a1
  5583.     bsr    get_com_no
  5584.     bpl    @f
  5585.     lea    opm_reg_name3-work(a6),a1
  5586.     bsr    get_com_no
  5587.     bmi    m_unknown_register_name
  5588. @@:
  5589.     lsl.b    #4,d2
  5590.     or.b    d0,d2
  5591.     bra    get_rg_data
  5592. 1:
  5593.     tas.b    d2            *OPパラメータがないレジスタは負値に変換
  5594. get_rg_data:
  5595.     bsr    skip_sep        *skip ','
  5596.     bsr    chk_num
  5597.     bmi    m_parameter_cannot_be_omitted
  5598.     cmpi.b    #'-',(a4)
  5599.     beq    rltv_mml_opm
  5600.     cmpi.b    #'+',(a4)
  5601.     beq    rltv_mml_opm
  5602.     bsr    get_num            *get data
  5603.     cmp.l    #$ff,d1
  5604.     bhi    m_illegal_parameter_value
  5605.     moveq.l    #opm_regset_zmd,d0        *command code
  5606.     bsr    do_wrt_trk_b
  5607.     move.l    d2,d0
  5608.     bsr    do_wrt_trk_b        *reg number
  5609.     move.l    d1,d0
  5610.     bra    do_wrt_trk_b        *data
  5611.  
  5612. rltv_mml_opm:
  5613.     bsr    get_num            *get data
  5614.     cmp.l    #-128,d1
  5615.     blt    m_illegal_parameter_value
  5616.     cmp.l    #127,d1
  5617.     bgt    m_illegal_parameter_value
  5618.     moveq.l    #rltv_opm_regset_zmd,d0    *command code
  5619.     bsr    do_wrt_trk_b
  5620.     move.l    d2,d0
  5621.     bsr    do_wrt_trk_b        *reg number
  5622.     move.l    d1,d0
  5623.     bra    do_wrt_trk_b        *data
  5624.  
  5625. _4x_mmlopm:
  5626.     move.l    d0,d2
  5627.     move.l    a4,d3            *preserve
  5628.     bsr    skip_sep        *パラメータ数チェック
  5629.     bsr    chk_num
  5630.     bmi    1f
  5631.     bsr    get_num
  5632.     bsr    skip_spc
  5633.     cmp.l    a4,d4
  5634.     bls    m_illegal_command_line    *']'がない
  5635.     cmpi.b    #']',(a4)
  5636.     beq    _4x_samvopm        *パラメータ1この場合
  5637. 1:
  5638.     move.l    d3,a4
  5639.     moveq.l    #4-1,d3
  5640.     lea    opmregop_tbl(pc),a1
  5641. _4xmoplp00:
  5642.     bsr    skip_sep        *skip ','
  5643.     bsr    chk_num
  5644.     bmi    next_4xmoplp00
  5645.     cmpi.b    #'-',(a4)
  5646.     beq    @f
  5647.     cmpi.b    #'+',(a4)
  5648.     beq    @f
  5649.     bsr    get_num            *get data
  5650.     cmp.l    #$ff,d1
  5651.     bhi    m_illegal_parameter_value
  5652.     moveq.l    #opm_regset_zmd,d0        *command code
  5653.     bra    1f
  5654. @@:                    *相対ケース
  5655.     bsr    get_num            *get data
  5656.     cmp.l    #-128,d1
  5657.     blt    m_illegal_parameter_value
  5658.     cmp.l    #127,d1
  5659.     bgt    m_illegal_parameter_value
  5660.     moveq.l    #rltv_opm_regset_zmd,d0    *command code
  5661. 1:
  5662.     bsr    do_wrt_trk_b
  5663.     move.l    d2,d0
  5664.     add.b    (a1),d0
  5665.     bsr    do_wrt_trk_b        *reg number
  5666.     move.l    d1,d0
  5667.     bsr    do_wrt_trk_b        *data
  5668. next_4xmoplp00:
  5669.     addq.w    #1,a1
  5670.     dbra    d3,_4xmoplp00
  5671.     rts
  5672.  
  5673. opmregop_tbl:    dc.b    $00,$20,$10,$30
  5674.  
  5675. _4x_samvopm
  5676.     move.l    d3,a4
  5677.     bsr    skip_sep        *skip ','
  5678.     bsr    chk_num
  5679.     bmi    m_parameter_cannot_be_omitted
  5680.     cmpi.b    #'-',(a4)
  5681.     beq    1f
  5682.     cmpi.b    #'+',(a4)
  5683.     beq    1f
  5684.     bsr    get_num            *get data
  5685.     cmp.l    #$ff,d1
  5686.     bhi    m_illegal_parameter_value
  5687.     moveq.l    #4-1,d3
  5688.     lea    opmregop_tbl(pc),a1
  5689. @@:
  5690.     moveq.l    #opm_regset_zmd,d0        *command code
  5691.     bsr    do_wrt_trk_b
  5692.     move.l    d2,d0
  5693.     add.b    (a1)+,d0
  5694.     bsr    do_wrt_trk_b        *reg number
  5695.     move.l    d1,d0
  5696.     bsr    do_wrt_trk_b        *data
  5697.     dbra    d3,@b
  5698.     rts
  5699.  
  5700. 1:
  5701.     bsr    get_num            *get data
  5702.     cmp.l    #-128,d1
  5703.     blt    m_illegal_parameter_value
  5704.     cmp.l    #127,d1
  5705.     bgt    m_illegal_parameter_value
  5706.     moveq.l    #4-1,d3
  5707.     lea    opmregop_tbl(pc),a1
  5708. @@:
  5709.     moveq.l    #rltv_opm_regset_zmd,d0    *command code
  5710.     bsr    do_wrt_trk_b
  5711.     move.l    d2,d0
  5712.     add.b    (a1)+,d0
  5713.     bsr    do_wrt_trk_b        *reg number
  5714.     move.l    d1,d0
  5715.     bsr    do_wrt_trk_b        *data
  5716.     dbra    d3,@b
  5717.     rts
  5718.  
  5719. mml_control:            *[CONTROL]
  5720.     bsr    chk_num
  5721.     bpl    @f
  5722.     lea    control_name-work(a6),a1
  5723.     bsr    get_com_no
  5724.     bmi    m_illegal_control_number
  5725.     bra    get_ctrl_data
  5726. mml_y:                *Y コマンド
  5727.     bsr    chk_num
  5728.     bmi    m_parameter_cannot_be_omitted
  5729. @@:
  5730.     bsr    get_num        *get register number
  5731.     cmp.l    #$ff,d1
  5732.     bhi    m_illegal_register_number
  5733. get_ctrl_data:
  5734.     move.l    d1,d2
  5735.     bsr    skip_sep    *skip ','
  5736.     bsr    chk_num
  5737.     bmi    m_parameter_cannot_be_omitted
  5738.     bsr    get_num        *get data
  5739.     cmp.l    #$ff,d1
  5740.     bhi    m_illegal_parameter_value
  5741.     moveq.l    #reg_set_zmd,d0        *command code
  5742.     bsr    do_wrt_trk_b
  5743.     move.l    d2,d0
  5744.     bsr    do_wrt_trk_b    *reg number
  5745.     move.l    d1,d0
  5746.     bsr    do_wrt_trk_b    *data
  5747.     tst.b    seq_cmd-work(a6)
  5748.     beq    mml_lp
  5749.     rts
  5750.  
  5751. mml_h:                *モジュレーション波形のホールド
  5752.     moveq.l    #-1,d2
  5753.     bsr    chk_num
  5754.     bmi    mml_h2
  5755.     bsr    get_num
  5756.     moveq.l    #pmod_sync_zmd,d0
  5757.     bsr    do_wrt_trk_b
  5758.     moveq.l    #$80,d0        *sync
  5759.     tst.l    d1        *switch value
  5760.     beq    @f
  5761.     moveq.l    #$00,d0        *hold
  5762. @@:
  5763.     bsr    do_wrt_trk_b
  5764.     moveq.l    #1,d0
  5765.     bsr    do_wrt_trk_w
  5766.     move.l    d1,d2
  5767. mml_h2:
  5768.     bsr    skip_sep    *skip ','
  5769.     moveq.l    #-1,d3
  5770.     bsr    chk_num
  5771.     bmi    1f
  5772.     bsr    get_num
  5773.     moveq.l    #arcc_sync_zmd,d0
  5774.     bsr    do_wrt_trk_b
  5775.     moveq.l    #0,d0        *arcc no.
  5776.     bsr    do_wrt_trk_b
  5777.     moveq.l    #$80,d0        *sync
  5778.     tst.l    d1        *switch value
  5779.     beq    @f
  5780.     moveq.l    #$00,d0        *hold
  5781. @@:
  5782.     bsr    do_wrt_trk_b
  5783.     moveq.l    #1,d0
  5784.     bsr    do_wrt_trk_w
  5785.     move.l    d1,d3
  5786. 1:
  5787.     move.l    d2,d0
  5788.     and.l    d3,d0
  5789.     bmi    m_illegal_parameters_combination    *両方省略はエラー
  5790.     bra    mml_lp
  5791.  
  5792. mml_m:                *モジュレーションモード選択
  5793.     moveq.l    #-1,d2
  5794.     bsr    chk_num
  5795.     bmi    @f
  5796.     bsr    get_num
  5797.     cmp.l    #2,d1
  5798.     bhi    m_illegal_mode_value    *規定外
  5799.     moveq.l    #pmod_mode_zmd,d0
  5800.     bsr    do_wrt_trk_b
  5801.     move.l    d1,d0            *mode value
  5802.     subq.b    #1,d0            *-1,0,+1
  5803.     bsr    do_wrt_trk_b
  5804.     move.l    d1,d2
  5805. @@:
  5806.     moveq.l    #-1,d3
  5807.     bsr    skip_sep    *skip ','
  5808.     bsr    chk_num
  5809.     bmi    @f
  5810.     bsr    get_num
  5811.     cmp.l    #1,d1
  5812.     bhi    m_illegal_mode_value    *規定外
  5813.     moveq.l    #arcc_mode_zmd,d0
  5814.     bsr    do_wrt_trk_b
  5815.     moveq.l    #0,d0            *arcc no.
  5816.     bsr    do_wrt_trk_b
  5817.     move.l    d1,d0            *mode value
  5818.     subq.b    #1,d0            *-1,0
  5819.     bsr    do_wrt_trk_b
  5820.     move.l    d1,d3
  5821. @@:
  5822.     move.l    d2,d0
  5823.     and.l    d3,d0
  5824.     bmi    m_illegal_parameters_combination    *両方省略はエラー
  5825.     bra    mml_lp
  5826.  
  5827. mml_vibrato_mode:            *[VIBRATO.MODE]
  5828.     bsr    chk_num
  5829.     bpl    @f
  5830.     lea    vib_mode-work(a6),a1
  5831.     bsr    get_com_no
  5832.     bmi    m_illegal_mode_value    *規定外
  5833.     move.l    d0,d1
  5834.     bra    do_wrt_mvm
  5835. @@:
  5836.     bsr    get_num
  5837.     cmp.l    #2,d1
  5838.     bhi    m_illegal_mode_value    *規定外
  5839. do_wrt_mvm:
  5840.     moveq.l    #pmod_mode_zmd,d0
  5841.     bsr    do_wrt_trk_b
  5842.     move.l    d1,d0            *mode value
  5843.     subq.b    #1,d0            *-1,0,+1
  5844.     bra    do_wrt_trk_b
  5845.  
  5846. mml_arcc4_deepen:            *[ARCC4.DEEPEN]
  5847.     moveq.l    #arcc_deepen_zmd,d0
  5848.     bsr    do_wrt_trk_b
  5849.     moveq.l    #6,d0            *arcc no.
  5850.     bsr    do_wrt_trk_b
  5851.     moveq.l    #0,d0            *dummy omt
  5852.     bsr    do_wrt_trk_b
  5853.     lea    do_wrt_trk_b(pc),a2
  5854.     bra    @f
  5855.  
  5856. mml_arcc3_deepen:            *[ARCC3.DEEPEN]
  5857.     moveq.l    #arcc_deepen_zmd,d0
  5858.     bsr    do_wrt_trk_b
  5859.     moveq.l    #4,d0            *arcc no.
  5860.     bsr    do_wrt_trk_b
  5861.     moveq.l    #0,d0            *dummy omt
  5862.     bsr    do_wrt_trk_b
  5863.     lea    do_wrt_trk_b(pc),a2
  5864.     bra    @f
  5865.  
  5866. mml_arcc2_deepen:            *[ARCC2.DEEPEN]
  5867.     moveq.l    #arcc_deepen_zmd,d0
  5868.     bsr    do_wrt_trk_b
  5869.     moveq.l    #2,d0            *arcc no.
  5870.     bsr    do_wrt_trk_b
  5871.     moveq.l    #0,d0            *dummy omt
  5872.     bsr    do_wrt_trk_b
  5873.     lea    do_wrt_trk_b(pc),a2
  5874.     bra    @f
  5875.  
  5876. mml_arcc1_deepen:            *[ARCC1.DEEPEN]
  5877.     moveq.l    #arcc_deepen_zmd,d0
  5878.     bsr    do_wrt_trk_b
  5879.     moveq.l    #0,d0            *arcc no.
  5880.     bsr    do_wrt_trk_b
  5881.     moveq.l    #0,d0            *dummy omt
  5882.     bsr    do_wrt_trk_b
  5883.     lea    do_wrt_trk_b(pc),a2
  5884.     bra    @f
  5885.  
  5886. mml_velocity_deepen:            *[VELOCITY.DEEPEN]
  5887.     moveq.l    #vseq_deepen_zmd,d0
  5888.     bsr    do_wrt_trk_b
  5889.     moveq.l    #0,d0            *dummy omt
  5890.     bsr    do_wrt_trk_b
  5891.     lea    do_wrt_trk_b(pc),a2
  5892. @@:
  5893.     move.l    tpt_now(a5),d5
  5894.     moveq.l    #$80,d6            *ON(omt)
  5895.     bsr    chk_num
  5896.     bpl    @f
  5897.     lea    vibdpn_strv-work(a6),a1
  5898.     bsr    get_com_no
  5899.     bmi    m_illegal_mode_value    *規定外
  5900.     tst.l    d0
  5901.     bne    @f
  5902.     moveq.l    #$00,d6
  5903. @@:                    *get speed
  5904.     bsr    skip_sep
  5905.     bsr    chk_num
  5906.     bmi    @f
  5907.     bsr    get_num
  5908.     move.l    d1,d2
  5909.     beq    m_illegal_speed_value    *規定外
  5910.     cmp.l    #65535,d2
  5911.     bhi    m_illegal_speed_value    *規定外
  5912.     ori.b    #$40,d6
  5913. @@:                    *get depth
  5914.     bsr    skip_sep
  5915.     bsr    chk_num
  5916.     bmi    mvd_get_repeat
  5917.     bsr    get_num
  5918.     cmpi.l    #-128,d1
  5919.     blt    m_illegal_depth_value
  5920.     cmpi.l    #127,d1
  5921.     bgt    m_illegal_depth_value
  5922.     move.l    d1,d3
  5923.     ori.b    #$20,d6
  5924.     bra    mvd_get_repeat
  5925.  
  5926. mml_agogik_deepen:            *[AGOGIK.DEEPEN]
  5927.     moveq.l    #agogik_deepen_zmd,d0
  5928.     bsr    do_wrt_trk_b
  5929.     moveq.l    #0,d0            *dummy omt
  5930.     bsr    do_wrt_trk_b
  5931.     lea    do_wrt_trk_w(pc),a2
  5932.     bra    @f
  5933.  
  5934. mml_vibrato_deepen:            *[VIBRATO.DEEPEN]
  5935.     moveq.l    #pmod_deepen_zmd,d0
  5936.     bsr    do_wrt_trk_b
  5937.     moveq.l    #0,d0            *dummy omt
  5938.     bsr    do_wrt_trk_b
  5939.     lea    do_wrt_trk_w(pc),a2
  5940. @@:
  5941.     move.l    tpt_now(a5),d5
  5942.     moveq.l    #$80,d6            *ON(omt)
  5943.     bsr    chk_num
  5944.     bpl    @f
  5945.     lea    vibdpn_strv-work(a6),a1
  5946.     bsr    get_com_no
  5947.     bmi    m_illegal_mode_value    *規定外
  5948.     tst.l    d0
  5949.     bne    @f
  5950.     moveq.l    #$00,d6
  5951. @@:                    *get speed
  5952.     bsr    skip_sep
  5953.     bsr    chk_num
  5954.     bmi    mvd_get_dpn
  5955.     bsr    get_num
  5956.     move.l    d1,d2
  5957.     beq    m_illegal_speed_value    *規定外
  5958.     cmp.l    #65535,d2
  5959.     bhi    m_illegal_speed_value    *規定外
  5960.     ori.b    #$40,d6
  5961. mvd_get_dpn:                *get depth
  5962.     bsr    skip_sep
  5963.     bsr    chk_num
  5964.     bmi    mvd_get_repeat
  5965.     bsr    get_num
  5966.     cmpi.l    #-32768,d1
  5967.     blt    m_illegal_depth_value
  5968.     cmpi.l    #32767,d1
  5969.     bgt    m_illegal_depth_value
  5970.     move.l    d1,d3
  5971.     ori.b    #$20,d6
  5972. mvd_get_repeat:                *get repeat time
  5973.     bsr    skip_sep
  5974.     bsr    chk_num
  5975.     bpl    @f
  5976.     lea    vibdpnlp_strv-work(a6),a1
  5977.     bsr    get_com_no
  5978.     bmi    do_wrt_mvd
  5979.     moveq.l    #0,d1            *d1=0:loop
  5980.     ori.b    #$10,d6
  5981.     bra    do_wrt_mvd
  5982. @@:
  5983.     bsr    get_num
  5984.     cmpi.l    #32767,d1
  5985.     bhi    m_illegal_repeat_time
  5986.     ori.b    #$10,d6
  5987. do_wrt_mvd:
  5988.     move.l    tpt_addr(a5),a1
  5989.     move.b    d6,-1(a1,d5.l)        *set omt
  5990.     add.b    d6,d6
  5991.     bpl    @f
  5992.     move.l    d2,d0            *speed
  5993.     bsr    do_wrt_trk_v
  5994. @@:
  5995.     add.b    d6,d6
  5996.     bpl    @f
  5997.     move.l    d3,d0            *depth accelarator
  5998.     jsr    (a2)            *do_wrt_trk_w/do_wrt_trk_b
  5999. @@:
  6000.     add.b    d6,d6
  6001.     bpl    @f
  6002.     move.l    d1,d0
  6003.     bra    do_wrt_trk_v
  6004. @@:
  6005.     rts
  6006.  
  6007. mml_velocity_waveform:            *[VELOCITY.WAVEFORM]
  6008.     moveq.l    #0,d6            *omt
  6009.     bsr    chk_num
  6010.     bpl    @f
  6011.     lea    wvfm_tbl-work(a6),a1
  6012.     bsr    get_com_no
  6013.     bmi    m_illegal_wave_number    *規定外
  6014.     move.l    d0,d1
  6015.     ori.b    #1,d6            *set omt
  6016.     bra    1f
  6017. @@:
  6018.     bsr    get_num
  6019.     cmp.l    #wv_reg_max+wv_def_max-1,d1
  6020.     bhi    m_illegal_wave_number    *規定外
  6021.     ori.b    #1,d6            *set omt
  6022.     cmpi.b    #4,d1
  6023.     bls    1f
  6024.     cmpi.b    #7,d1
  6025.     bls    m_illegal_wave_number    *4~7はリザーブ
  6026.     subq.w    #8,d1
  6027.     ori.w    #$8000,d1        *ユーザー波形マーク
  6028. 1:
  6029.     move.l    d1,d2
  6030.     bsr    skip_sep
  6031.     bsr    chk_num
  6032.     bmi    @f
  6033.     bsr    get_num            *基準点取得
  6034.     cmpi.l    #127,d1
  6035.     bhi    m_illegal_wave_origin
  6036.     move.l    d1,d3
  6037.     ori.b    #2,d6            *set omt
  6038. @@:
  6039.     bsr    skip_sep
  6040.     bsr    chk_num
  6041.     bmi    1f
  6042.     ori.b    #4,d6            *set omt
  6043.     bsr    get_num            *phase
  6044.     suba.l    a1,a1
  6045.     tst.l    d1
  6046.     beq    1f
  6047.     subq.w    #1,a1
  6048. 1:
  6049. do_wrt_cseq_wf:
  6050.     tst.l    d6
  6051.     beq    m_illegal_parameters_combination    *全部省略はダメ
  6052.     moveq.l    #vseq_wf_zmd,d0
  6053.     bsr    do_wrt_trk_b
  6054.     move.l    d6,d0            *omt
  6055.     bsr    do_wrt_trk_b
  6056.     lsr.b    #1,d6
  6057.     bcc    @f
  6058.     move.l    d2,d0            *wf number
  6059.     bsr    do_wrt_trk_w
  6060. @@:
  6061.     lsr.b    #1,d6
  6062.     bcc    @f
  6063.     move.l    d3,d0            *wf default
  6064.     bsr    do_wrt_trk_b
  6065. @@:
  6066.     lsr.b    #1,d6
  6067.     bcc    @f
  6068.     move.l    a1,d0            *phase
  6069.     bra    do_wrt_trk_b
  6070. @@:
  6071.     rts
  6072.  
  6073. mml_velocity_origin:            *[VELOCITY_ORIGIN]
  6074.     bsr    chk_num
  6075.     bmi    m_parameter_cannot_be_omitted
  6076.     bsr    get_num            *基準点取得
  6077.     cmpi.l    #127,d1
  6078.     bhi    m_illegal_wave_origin
  6079.     move.l    d1,d3
  6080.     moveq.l    #2,d6            *set omt
  6081.     bra    do_wrt_cseq_wf
  6082.  
  6083. mml_velocity_phase:            *[VELOCITY_PHASE]
  6084.     bsr    chk_num
  6085.     bmi    @f
  6086.     bsr    get_num            *基準点取得
  6087.     tst.l    d1
  6088.     bra    1f
  6089. @@:
  6090.     lea    phase_tbl-work(a6),a1
  6091.     bsr    get_com_no
  6092.     bmi    m_undefined_phase_type
  6093.     moveq.l    #0,d1
  6094.     tst.l    d0
  6095. 1:
  6096.     beq    @f
  6097.     moveq.l    #-1,d1
  6098. @@:
  6099.     move.l    d1,a1
  6100.     moveq.l    #4,d6            *set omt
  6101.     bra    do_wrt_cseq_wf
  6102.  
  6103. mml_agogik_waveform:            *[AGOGIK.WAVEFORM]
  6104.     moveq.l    #agogik_wf_zmd,d2
  6105.     bra    @f
  6106. mml_vibrato_waveform:            *[VIBRATO.WAVEFORM]
  6107.     moveq.l    #pmod_wf_zmd,d2
  6108. @@:
  6109.     bsr    chk_num
  6110.     bpl    @f
  6111.     lea    wvfm_tbl-work(a6),a1
  6112.     bsr    get_com_no
  6113.     bmi    m_illegal_wave_number    *規定外
  6114.     move.l    d0,d1
  6115.     bra    1f
  6116. @@:
  6117.     bsr    get_num
  6118.     cmp.l    #wv_reg_max+wv_def_max-1,d1
  6119.     bhi    m_illegal_wave_number    *規定外
  6120.     cmpi.b    #4,d1
  6121.     bls    1f
  6122.     cmpi.b    #7,d1
  6123.     bls    m_illegal_wave_number    *4~7はリザーブ
  6124.     subq.w    #8,d1
  6125.     ori.w    #$8000,d1        *ユーザー波形マーク
  6126. 1:
  6127.     move.l    d2,d0
  6128.     bsr    do_wrt_trk_b
  6129.     move.l    d1,d0            *wf number
  6130.     bra    do_wrt_trk_w
  6131.  
  6132. mml_agogik_switch:            *[AGOGIK.SWITCH]
  6133.     move.l    #agogik8_zmd*65536+agogik_sw_zmd,d2
  6134.     bra    @f
  6135. mml_velocity_switch:            *[VELOCITY.SWITCH]
  6136.     move.l    #vseq8_zmd*65536+vseq_sw_zmd,d2
  6137.     bra    @f
  6138. mml_aftertouch_switch:            *[AFTERTOUCH.SWITCH]
  6139.     move.l    #aftertouch_zmd*65536+aftc_sw_zmd,d2
  6140.     bra    @f
  6141. mml_vibrato_switch:            *[VIBRATO.SWITCH]
  6142.     move.l    #pmod8_zmd*65536+pmod_sw_zmd,d2
  6143. @@:
  6144.     lea    switch_strv3-work(a6),a1
  6145.     bsr    get_com_no
  6146.     bmi    @f
  6147.     move.l    d0,d1            *0-4
  6148.     subq.b    #1,d1            *-1,0,1,2,3
  6149.     cmpi.b    #2,d1
  6150.     bls    do_wrt_mvs
  6151.     swap    d2
  6152.     move.l    d2,d0            *cmd
  6153.     bsr    do_wrt_trk_b
  6154.     moveq.l    #0,d0            *mode=omt=0
  6155.     bra    do_wrt_trk_w
  6156. @@:
  6157.     bsr    chk_num
  6158.     bmi    m_illegal_switch_value    *規定外
  6159.     bsr    get_num
  6160.     cmp.l    #-1,d1
  6161.     blt    m_illegal_switch_value    *規定外
  6162.     cmp.l    #2,d1
  6163.     bgt    m_illegal_switch_value    *規定外
  6164. do_wrt_mvs:
  6165.     move.l    d2,d0            *cmd
  6166.     bsr    do_wrt_trk_b
  6167.     move.l    d1,d0            *mode value
  6168.     bra    do_wrt_trk_b
  6169.  
  6170. mml_vibrato_sync:            *[VIBRATO.SYNC]
  6171.     bsr    chk_num
  6172.     bpl    @f
  6173.     lea    vib_sync-work(a6),a1
  6174.     bsr    get_com_no
  6175.     bmi    m_illegal_mode_value    *規定外
  6176.     move.l    d0,d1            *0/1
  6177.     bra    1f
  6178. @@:
  6179.     bsr    get_num
  6180.     cmp.l    #%11111,d1
  6181.     bhi    m_illegal_mode_value    *規定外
  6182. 1:
  6183.     moveq.l    #pmod_sync_zmd,d0
  6184.     bsr    do_wrt_trk_b
  6185.     moveq.l    #0,d0            *mode value
  6186.     moveq.l    #5-1,d2
  6187. @@:
  6188.     lsr.b    #1,d1
  6189.     roxl.b    #1,d0
  6190.     dbra    d2,@b
  6191.     lsl.b    #3,d0
  6192.     bra    get_sync_count
  6193. *-----------------------------------------------------------------------------
  6194. mml_aftertouch_sync:            *[AFTERTOUCH.SYNC]
  6195.     bsr    chk_num
  6196.     bpl    @f
  6197.     lea    vib_sync-work(a6),a1
  6198.     bsr    get_com_no
  6199.     bmi    m_illegal_mode_value    *規定外
  6200.     move.l    d0,d1            *0/1
  6201.     bra    1f
  6202. @@:
  6203.     bsr    get_num
  6204.     cmp.l    #%111,d1
  6205.     bhi    m_illegal_mode_value    *規定外
  6206. 1:
  6207.     moveq.l    #aftc_sync_zmd,d0
  6208.     bsr    do_wrt_trk_b
  6209.     moveq.l    #0,d0            *mode value
  6210.     moveq.l    #3-1,d2
  6211. @@:
  6212.     lsr.b    #1,d1
  6213.     roxl.b    #1,d0
  6214.     dbra    d2,@b
  6215.     lsl.b    #5,d0
  6216.     bra    get_sync_count
  6217. *-----------------------------------------------------------------------------
  6218. mml_agogik_sync:            *[AGOGIK.SYNC]
  6219.     bsr    chk_num
  6220.     bpl    @f
  6221.     lea    agogik_sync-work(a6),a1
  6222.     bsr    get_com_no
  6223.     bmi    m_illegal_mode_value    *規定外
  6224.     move.l    d0,d1
  6225.     bra    1f
  6226. @@:
  6227.     bsr    get_num
  6228.     cmp.l    #%0011_1111,d1
  6229.     bhi    m_illegal_mode_value    *規定外
  6230. 1:
  6231.     moveq.l    #agogik_sync_zmd,d0
  6232.     bsr    do_wrt_trk_b
  6233.     moveq.l    #0,d0            *mode value
  6234.     moveq.l    #6-1,d2
  6235. @@:
  6236.     lsr.b    #1,d1
  6237.     roxl.b    #1,d0
  6238.     dbra    d2,@b
  6239.     lsl.b    #2,d0
  6240. get_sync_count:
  6241.     bsr    do_wrt_trk_b
  6242.     bsr    skip_sep
  6243.     moveq.l    #0,d0
  6244.     bsr    chk_num
  6245.     bmi    do_wrt_trk_w
  6246.     bsr    get_num
  6247.     cmpi.l    #65535,d1
  6248.     bhi    m_illegal_parameter_value
  6249.     move.l    d1,d0
  6250.     beq    m_illegal_parameter_value
  6251.     bra    do_wrt_trk_w
  6252. *-----------------------------------------------------------------------------
  6253. mml_velocity_sync:            *[VELOCITY.SYNC]
  6254.     bsr    chk_num
  6255.     bpl    @f
  6256.     lea    vseq_sync-work(a6),a1
  6257.     bsr    get_com_no
  6258.     bmi    m_illegal_mode_value    *規定外
  6259.     move.l    d0,d1
  6260.     bra    1f
  6261. @@:
  6262.     bsr    get_num
  6263.     cmp.l    #%111,d1
  6264.     bhi    m_illegal_mode_value    *規定外
  6265. 1:
  6266.     moveq.l    #vseq_sync_zmd,d0
  6267.     bsr    do_wrt_trk_b
  6268.     moveq.l    #0,d0            *mode value
  6269.     moveq.l    #3-1,d2
  6270. @@:
  6271.     lsr.b    #1,d1
  6272.     roxl.b    #1,d0
  6273.     dbra    d2,@b
  6274.     lsl.b    #5,d0
  6275.     bra    get_sync_count
  6276. *-----------------------------------------------------------------------------
  6277. mml_arcc4_mode:                *[ARCC4.MODE]
  6278.     moveq.l    #6,d2            *arcc number
  6279.     bra    @f
  6280. mml_arcc3_mode:                *[ARCC3.MODE]
  6281.     moveq.l    #4,d2            *arcc number
  6282.     bra    @f
  6283. mml_arcc2_mode:                *[ARCC2.MODE]
  6284.     moveq.l    #2,d2            *arcc number
  6285.     bra    @f
  6286. mml_arcc1_mode:                *[ARCC1.MODE]
  6287.     moveq.l    #0,d2            *arcc number
  6288. @@:
  6289.     bsr    chk_num
  6290.     bpl    @f
  6291.     lea    arccmd_tbl-work(a6),a1
  6292.     bsr    get_com_no        *> d0=0:normal,1:special,2:enhanced
  6293.     bmi    m_illegal_mode_value    *規定外
  6294.     move.l    d0,d1
  6295.     cmpi.b    #2,d1
  6296.     bcs    do_wrt_mam
  6297.     moveq.l    #1,d1            *ENHANCEDはSPECIALと同値に
  6298.     bra    do_wrt_mam
  6299. @@:
  6300.     bsr    get_num
  6301.     cmp.l    #1,d1
  6302.     bhi    m_illegal_mode_value    *規定外
  6303. do_wrt_mam:
  6304.     moveq.l    #arcc_mode_zmd,d0
  6305.     bsr    do_wrt_trk_b
  6306.     move.l    d2,d0            *arcc number(0-3)*2
  6307.     bsr    do_wrt_trk_b
  6308.     move.l    d1,d0            *mode value
  6309.     subq.b    #1,d0            *-1,0
  6310.     bra    do_wrt_trk_b
  6311.  
  6312. mml_arcc4_switch:            *[ARCC4.SWITCH]
  6313.     moveq.l    #6,d2            *arcc number
  6314.     bra    @f
  6315. mml_arcc3_switch:            *[ARCC3.SWITCH]
  6316.     moveq.l    #4,d2            *arcc number
  6317.     bra    @f
  6318. mml_arcc2_switch:            *[ARCC2.SWITCH]
  6319.     moveq.l    #2,d2            *arcc number
  6320.     bra    @f
  6321. mml_arcc1_switch:            *[ARCC1.SWITCH]
  6322.     moveq.l    #0,d2            *arcc number
  6323. @@:
  6324.     lea    switch_strv3-work(a6),a1
  6325.     bsr    get_com_no
  6326.     bmi    @f
  6327.     move.l    d0,d1            *0-4
  6328.     subq.b    #1,d1            *-1,0,1,2,3
  6329.     cmpi.b    #2,d1
  6330.     bls    do_wrt_mas
  6331.     moveq.l    #arcc8_zmd,d0
  6332.     bsr    do_wrt_trk_b
  6333.     move.l    d2,d0            *arcc number(0-3)*2
  6334.     bsr    do_wrt_trk_b
  6335.     moveq.l    #0,d0            *mode=omt=0
  6336.     bra    do_wrt_trk_w
  6337. @@:
  6338.     bsr    chk_num
  6339.     bmi    m_illegal_switch_value    *規定外
  6340.     bsr    get_num
  6341.     cmp.l    #-1,d1
  6342.     blt    m_illegal_switch_value    *規定外
  6343.     cmp.l    #2,d1
  6344.     bgt    m_illegal_switch_value    *規定外
  6345. do_wrt_mas:
  6346.     moveq.l    #arcc_sw_zmd,d0
  6347.     bsr    do_wrt_trk_b
  6348.     move.l    d2,d0            *arcc number(0-3)*2
  6349.     bsr    do_wrt_trk_b
  6350.     move.l    d1,d0            *mode value
  6351.     bra    do_wrt_trk_b
  6352.  
  6353. mml_arcc4_sync:                *[ARCC4_SYNC]
  6354.     moveq.l    #6,d2            *arcc number
  6355.     bra    @f
  6356. mml_arcc3_sync:                *[ARCC3_SYNC]
  6357.     moveq.l    #4,d2            *arcc number
  6358.     bra    @f
  6359. mml_arcc2_sync:                *[ARCC2_SYNC]
  6360.     moveq.l    #2,d2            *arcc number
  6361.     bra    @f
  6362. mml_arcc1_sync:                *[ARCC1_SYNC]
  6363.     moveq.l    #0,d2            *arcc number
  6364. @@
  6365.     bsr    chk_num
  6366.     bpl    @f
  6367.     lea    arcc_sync-work(a6),a1
  6368.     bsr    get_com_no
  6369.     bmi    m_illegal_mode_value    *規定外
  6370.     move.l    d0,d1
  6371.     bra    do_wrt_masy
  6372. @@:
  6373.     bsr    get_num
  6374.     cmp.l    #%11111,d1
  6375.     bhi    m_illegal_mode_value    *規定外
  6376. do_wrt_masy:
  6377.     moveq.l    #arcc_sync_zmd,d0
  6378.     bsr    do_wrt_trk_b
  6379.     move.l    d2,d0            *arcc number(0-3)
  6380.     bsr    do_wrt_trk_b
  6381.     moveq.l    #0,d0            *mode value
  6382.     moveq.l    #5-1,d2
  6383. @@:
  6384.     lsr.b    #1,d1
  6385.     roxl.b    #1,d0
  6386.     dbra    d2,@b
  6387.     lsl.b    #3,d0
  6388.     bra    get_sync_count
  6389. *-----------------------------------------------------------------------------
  6390. mml_s:                *モジュレーション波形タイプ
  6391.     moveq.l    #-1,d2
  6392.     bsr    chk_num
  6393.     bmi    mmls_ar
  6394.     bsr    get_num
  6395.     cmp.l    #wv_reg_max+wv_def_max-1,d1
  6396.     bhi    m_illegal_wave_number    *規定外
  6397.     cmpi.b    #4,d1
  6398.     bls    @f
  6399.     cmpi.b    #7,d1
  6400.     bls    m_illegal_wave_number    *4~7はリザーブ
  6401.     subq.w    #8,d1
  6402.     ori.w    #$8000,d1
  6403. @@:
  6404.     moveq.l    #pmod_wf_zmd,d0
  6405.     bsr    do_wrt_trk_b
  6406.     move.l    d1,d0            *wf number
  6407.     bsr    do_wrt_trk_w
  6408.     move.l    d1,d2
  6409. mmls_ar:
  6410.     moveq.l    #-1,d3
  6411.     bsr    skip_sep    *skip ','
  6412.     bsr    chk_num
  6413.     bmi    mmls_ar2
  6414.     bsr    get_num
  6415.     cmp.l    #wv_reg_max+wv_def_max-1,d1
  6416.     bhi    m_illegal_wave_number    *規定外
  6417.     cmpi.b    #4,d1
  6418.     bls    @f
  6419.     cmpi.b    #7,d1
  6420.     bls    m_illegal_wave_number    *4~7はリザーブ
  6421.     subq.w    #8,d1
  6422.     ori.w    #$8000,d1
  6423. @@:
  6424.     moveq.l    #arcc_wf_zmd,d0
  6425.     bsr    do_wrt_trk_b
  6426.     moveq.l    #0,d0            *arcc no.
  6427.     bsr    do_wrt_trk_b
  6428.     move.l    d1,d0            *wf number
  6429.     bsr    do_wrt_trk_w
  6430.     move.l    d1,d3
  6431. mmls_ar2:
  6432.     move.l    d2,d0
  6433.     and.l    d3,d0
  6434.     bmi    m_illegal_parameters_combination    *両方省略はダメ
  6435.     bra    mml_lp
  6436.  
  6437. renp_start:                    *連符スタート
  6438.     bset.b    #c_renp1,tpt_mode_flg(a5)    *mark    *音長はstep,gateともにワード長に
  6439.     bne    m_group_notes_command_error    *連符コマンド内で連符指定はできない
  6440.     clr.l    tpt_renp_cnt(a5)
  6441.     move.l    a4,tpt_renp_starta4(a5)
  6442.     movem.l    d0/d2-d3/a0-a2,-(sp)
  6443.     move.l    tpt_renp_addr(a5),d0
  6444.     bne    @f
  6445.     move.l    #(tpt_tsize+3).and.$ffff_fffc,d2
  6446.     move.l    #ID_TEMP,d3
  6447.     jsr    get_mem-work(a6)
  6448.     tst.l    d0
  6449.     bmi    error_irc
  6450.     move.l    a0,tpt_renp_addr(a5)
  6451.     move.l    a0,a2
  6452.     bra    irc00
  6453. @@:
  6454.     move.l    d0,a2
  6455. irc00:
  6456.     move.l    a5,a1
  6457.     move.w    #((tpt_tsize+3).and.$ffff_fffc)/4-1,d2
  6458. @@:
  6459.     move.l    (a1)+,(a2)+
  6460.     dbra    d2,@b
  6461.     movem.l    (sp)+,d0/d2-d3/a0-a2
  6462.     bra    mml_lp                *その音符の音長のアドレスを格納する
  6463.  
  6464. error_irc:
  6465.     clr.b    tpt_mode_flg(a5)
  6466.     bra    m_out_of_memory
  6467.  
  6468. renp_end:                    *連符エンド
  6469.     bclr.b    #c_renp2,tpt_mode_flg(a5)
  6470.     bne    renp_phase2_end
  6471.     bclr.b    #c_renp1,tpt_mode_flg(a5)
  6472.     bne    @f
  6473.     tst.b    now_cmd-work(a6)
  6474.     bmi    mmlc_exit
  6475.     bra    m_syntax_error
  6476. @@:
  6477.     btst.b    #c_break,tpt_mode_flg(a5)    *コンパイル中断フラグチェック
  6478.     bne    go_skip_mml
  6479.     bsr    chk_num
  6480.     bpl    rp_get_l        指定してある時…
  6481.     cmp.l    a4,d4
  6482.     bls    m_parameter_shortage
  6483.     cmpi.b    #DIRECT_LEN,(a4)    *'*'
  6484.     bne    @f
  6485.     addq.w    #1,a4            *skip '*'
  6486.     bsr    get_num            *get 連符音長
  6487.     cmpi.l    #max_note_len,d1
  6488.     bhi    m_illegal_note_length    *illegal length
  6489.     move.l    d1,d0
  6490.     bra    _renp_ed1
  6491. @@:
  6492.     moveq.l    #0,d0
  6493.     move.w    tpt_note_len(a5),d0    *音長省略のケース
  6494.     bra    _renp_ed1
  6495. rp_get_l:                *音長が指定してあるケース
  6496.     bsr    get_length
  6497.     bsr    futen_ope
  6498.     move.l    d1,d0
  6499.     andi.l    #$ffff,d0
  6500. _renp_ed1:
  6501.     move.l    tpt_renp_cnt(a5),d1    *number of keycodes
  6502.     beq    m_empty_brace_error    *there is no keycode inside!
  6503.     cmp.l    d1,d0
  6504.     bcs    m_too_many_notes    *too many keycodes inside!
  6505.     divu    d1,d0
  6506.     move.l    tpt_renp_addr(a5),a1
  6507.     move.l    tpt_renp_starta4(a1),d3    *get renp start addr.
  6508.     beq    m_empty_brace_error    *there is no keycode inside!
  6509.     exg.l    d3,a4
  6510. *!    subq.l    #1,a4
  6511.     move.l    a5,a2
  6512.     move.w    #((tpt_tsize+3).and.$ffff_fffc)/4-1,d2
  6513. @@:
  6514.     move.l    (a2),d1            *swap (a1)+,(a2)+
  6515.     move.l    (a1),(a2)+
  6516.     move.l    d1,(a1)+
  6517.     dbra    d2,@b
  6518.     move.l    d3,tpt_renp_starta4(a5)
  6519.     move.l    d0,tpt_renp_surplus(a5)    *tpt_renp_surplus,tpt_renp_length
  6520.     bclr.b    #c_renp1,tpt_mode_flg(a5)
  6521.     bset.b    #c_renp2,tpt_mode_flg(a5)
  6522.     bra    mml_lp
  6523.  
  6524. renp_phase2_end:                *連符処理すべて完了
  6525.     move.l    tpt_renp_starta4(a5),a4
  6526.     move.l    tpt_renp_addr(a5),a1
  6527.     move.w    tpt_velo_n(a5),d0
  6528.     move.l    tpt_now(a5),d1
  6529.     move.l    a5,a2
  6530.     move.w    #((tpt_tsize+3).and.$ffff_fffc)/4-1,d2
  6531. @@:
  6532.     move.l    (a1)+,(a2)+
  6533.     dbra    d2,@b
  6534.     move.l    d1,tpt_now(a5)
  6535.     move.w    d0,tpt_velo_n(a5)
  6536.     bra    mml_lp
  6537.  
  6538. *num_of_seq:    equ    (_cmd_tbl_end-_cmd_tbl)/2    *幾つのコマンドがあるか
  6539. mml_seq_command:                    *[]コマンド
  6540.     cmp.l    a4,d4
  6541.     bls    m_syntax_error        *error
  6542.     cmpi.b    #'/',(a4)
  6543.     bne    @f
  6544.     addq.w    #1,a4            *[/] case
  6545.     bsr    mml_compile_break_off
  6546.     bra    1f
  6547. @@:
  6548.     bsr    skip_spc
  6549.     cmp.l    a4,d4
  6550.     bls    m_syntax_error        *error
  6551.     cmpi.b    #'-',(a4)
  6552.     beq    case_mml_bar        *[---....]のケース
  6553.     lea    seq_com_tbl-work(a6),a1
  6554.     move.l    a4,d7            *mml_port_にいくために...
  6555.     bsr    get_com_no        *>d0.l=cmd number(0-)
  6556.     bmi    mml_port_        *ポルタメントとみなす
  6557.     st    seq_cmd-work(a6)
  6558.     bsr    skip_spc
  6559.     add.w    d0,d0
  6560.     move.w    _cmd_tbl(pc,d0.w),d0
  6561.     jsr    _cmd_tbl(pc,d0.w)
  6562. 1:
  6563.     bsr    skip_spc
  6564.     cmp.l    a4,d4
  6565.     bls    m_illegal_command_line    *']'がない
  6566.     cmpi.b    #']',(a4)+
  6567.     bne    m_illegal_command_line    *']'がない
  6568.     bsr    chk_num            *']'の後ろに数値があればそれはステップタイムとみなす
  6569.     bpl    mml_@w
  6570.     cmp.l    a4,d4
  6571.     bls    mml_lp
  6572.     cmpi.b    #'*',(a4)
  6573.     beq    mml_@w
  6574.     bra    mml_lp
  6575.  
  6576. _cmd_tbl:
  6577.     dc.w    mml_jump-_cmd_tbl            *[!]
  6578.     dc.w    mml_segno-_cmd_tbl            *[$]
  6579.     dc.w    mml_tocoda-_cmd_tbl            *[*]
  6580.     dc.w    mml_compile_break_off-_cmd_tbl        *[/]
  6581.     dc.w    mml_@detune-_cmd_tbl            *[@DETUNE]
  6582.     dc.w    mml_@panpot-_cmd_tbl            *[@PANPOT]
  6583.     dc.w    mml_@pitch-_cmd_tbl            *[@PITCH]
  6584.     dc.w    mml_@tempo-_cmd_tbl            *[@TEMPO]
  6585.     dc.w    mml_@velocity-_cmd_tbl            *[@VELOCITY]
  6586.     dc.w    mml_@volume-_cmd_tbl            *[@VOLUME]
  6587.     dc.w    mml_jump2-_cmd_tbl            *[@]
  6588.     dc.w    mml_aftertouch_delay-_cmd_tbl        *[AFTERTOUCH.DELAY]
  6589.     dc.w    mml_aftertouch_level-_cmd_tbl        *[AFTERTOUCH.LEVEL]
  6590.     dc.w    mml_aftertouch_switch-_cmd_tbl        *[AFTERTOUCH.SWITCH]
  6591.     dc.w    mml_aftertouch_sync-_cmd_tbl        *[AFTERTOUCH.SYNC]
  6592.     dc.w    mml_agogik_deepen-_cmd_tbl        *[AGOGIK.DEEPEN]
  6593.     dc.w    mml_agogik_delay-_cmd_tbl        *[AGOGIK.DELAY]
  6594.     dc.w    mml_agogik_depth-_cmd_tbl        *[AGOGIK.DEPTH]
  6595.     dc.w    mml_agogik_depth-_cmd_tbl        *[AGOGIK.LEVEL]
  6596.     dc.w    mml_agogik_speed-_cmd_tbl        *[AGOGIK.SPEED]
  6597.     dc.w    mml_agogik_switch-_cmd_tbl        *[AGOGIK.SWITCH]
  6598.     dc.w    mml_agogik_sync-_cmd_tbl        *[AGOGIK.SYNC]
  6599.     dc.w    mml_agogik_waveform-_cmd_tbl        *[AGOGIK.WAVEFORM]
  6600.     dc.w    mml_all_sound_off-_cmd_tbl        *[ALL_SOUND_OFF]
  6601.     dc.w    mml_arcc1_control-_cmd_tbl        *[ARCC1.CONTROL]
  6602.     dc.w    mml_arcc2_control-_cmd_tbl        *[ARCC2.CONTROL]
  6603.     dc.w    mml_arcc3_control-_cmd_tbl        *[ARCC3.CONTROL]
  6604.     dc.w    mml_arcc4_control-_cmd_tbl        *[ARCC4.CONTROL]
  6605.     dc.w    mml_arcc1_deepen-_cmd_tbl        *[ARCC1.DEEPEN]
  6606.     dc.w    mml_arcc2_deepen-_cmd_tbl        *[ARCC2.DEEPEN]
  6607.     dc.w    mml_arcc3_deepen-_cmd_tbl        *[ARCC3.DEEPEN]
  6608.     dc.w    mml_arcc4_deepen-_cmd_tbl        *[ARCC4.DEEPEN]
  6609.     dc.w    mml_arcc1_delay-_cmd_tbl        *[ARCC1.DELAY]
  6610.     dc.w    mml_arcc2_delay-_cmd_tbl        *[ARCC2.DELAY]
  6611.     dc.w    mml_arcc3_delay-_cmd_tbl        *[ARCC3.DELAY]
  6612.     dc.w    mml_arcc4_delay-_cmd_tbl        *[ARCC4.DELAY]
  6613.     dc.w    mml_arcc1_depth-_cmd_tbl        *[ARCC1.DEPTH]
  6614.     dc.w    mml_arcc2_depth-_cmd_tbl        *[ARCC2.DEPTH]
  6615.     dc.w    mml_arcc3_depth-_cmd_tbl        *[ARCC3.DEPTH]
  6616.     dc.w    mml_arcc4_depth-_cmd_tbl        *[ARCC4.DEPTH]
  6617.     dc.w    mml_arcc1_depth-_cmd_tbl        *[ARCC1.LEVEL]
  6618.     dc.w    mml_arcc2_depth-_cmd_tbl        *[ARCC2.LEVEL]
  6619.     dc.w    mml_arcc3_depth-_cmd_tbl        *[ARCC3.LEVEL]
  6620.     dc.w    mml_arcc4_depth-_cmd_tbl        *[ARCC4.LEVEL]
  6621.     dc.w    mml_arcc1_mode-_cmd_tbl            *[ARCC1.MODE]
  6622.     dc.w    mml_arcc2_mode-_cmd_tbl            *[ARCC2.MODE]
  6623.     dc.w    mml_arcc3_mode-_cmd_tbl            *[ARCC3.MODE]
  6624.     dc.w    mml_arcc4_mode-_cmd_tbl            *[ARCC4.MODE]
  6625.     dc.w    mml_arcc1_origin-_cmd_tbl        *[ARCC1.ORIGIN]
  6626.     dc.w    mml_arcc2_origin-_cmd_tbl        *[ARCC2.ORIGIN]
  6627.     dc.w    mml_arcc3_origin-_cmd_tbl        *[ARCC3.ORIGIN]
  6628.     dc.w    mml_arcc4_origin-_cmd_tbl        *[ARCC4.ORIGIN]
  6629.     dc.w    mml_arcc1_phase-_cmd_tbl        *[ARCC1.PHASE]
  6630.     dc.w    mml_arcc2_phase-_cmd_tbl        *[ARCC2.PHASE]
  6631.     dc.w    mml_arcc3_phase-_cmd_tbl        *[ARCC3.PHASE]
  6632.     dc.w    mml_arcc4_phase-_cmd_tbl        *[ARCC4.PHASE]
  6633.     dc.w    mml_arcc1_reset-_cmd_tbl        *[ARCC1.RESET]
  6634.     dc.w    mml_arcc2_reset-_cmd_tbl        *[ARCC2.RESET]
  6635.     dc.w    mml_arcc3_reset-_cmd_tbl        *[ARCC3.RESET]
  6636.     dc.w    mml_arcc4_reset-_cmd_tbl        *[ARCC4.RESET]
  6637.     dc.w    mml_arcc1_speed-_cmd_tbl        *[ARCC1.SPEED]
  6638.     dc.w    mml_arcc2_speed-_cmd_tbl        *[ARCC2.SPEED]
  6639.     dc.w    mml_arcc3_speed-_cmd_tbl        *[ARCC3.SPEED]
  6640.     dc.w    mml_arcc4_speed-_cmd_tbl        *[ARCC4.SPEED]
  6641.     dc.w    mml_arcc1_switch-_cmd_tbl        *[ARCC1.SWITCH]
  6642.     dc.w    mml_arcc2_switch-_cmd_tbl        *[ARCC2.SWITCH]
  6643.     dc.w    mml_arcc3_switch-_cmd_tbl        *[ARCC3.SWITCH]
  6644.     dc.w    mml_arcc4_switch-_cmd_tbl        *[ARCC4.SWITCH]
  6645.     dc.w    mml_arcc1_sync-_cmd_tbl            *[ARCC1.SYNC]
  6646.     dc.w    mml_arcc2_sync-_cmd_tbl            *[ARCC2.SYNC]
  6647.     dc.w    mml_arcc3_sync-_cmd_tbl            *[ARCC3.SYNC]
  6648.     dc.w    mml_arcc4_sync-_cmd_tbl            *[ARCC4.SYNC]
  6649.     dc.w    mml_arcc1_waveform-_cmd_tbl        *[ARCC1.WAVEFORM]
  6650.     dc.w    mml_arcc2_waveform-_cmd_tbl        *[ARCC2.WAVEFORM]
  6651.     dc.w    mml_arcc3_waveform-_cmd_tbl        *[ARCC3.WAVEFORM]
  6652.     dc.w    mml_arcc4_waveform-_cmd_tbl        *[ARCC4.WAVEFORM]
  6653.     dc.w    mml_ch_assign-_cmd_tbl            *[ASSIGN]
  6654.     dc.w    mml_auto_portament_switch-_cmd_tbl    *[AUTO_PORTAMENT.SWITCH]
  6655.     dc.w    mml_auto_portament-_cmd_tbl        *[AUTO_PORTAMENT]
  6656.     dc.w    mml_measure-_cmd_tbl            *[BAR]
  6657.     dc.w    mml_bend_range-_cmd_tbl            *[BEND.RANGE]
  6658.     dc.w    mml_bend_switch-_cmd_tbl        *[BEND.SWITCH]
  6659.     dc.w    mml_bend-_cmd_tbl            *[BEND]
  6660.     dc.w    mml_ch_assign-_cmd_tbl            *[CH_ASSIGN]
  6661.     dc.w    mml_ch_fader-_cmd_tbl            *[CH_FADER]
  6662.     dc.w    mml_ch_pressure-_cmd_tbl        *[CH_PRESSURE]
  6663.     dc.w    mml_coda-_cmd_tbl            *[CODA]
  6664.     dc.w    mml_comment-_cmd_tbl            *[COMMENT]
  6665.     dc.w    mml_control-_cmd_tbl            *[CONTROL]
  6666.     dc.w    mml_damper-_cmd_tbl            *[DAMPER]
  6667.     dc.w    mml_detune-_cmd_tbl            *[DETUNE]
  6668.     dc.w    mml_dc-_cmd_tbl                *[D.C.]
  6669.     dc.w    mml_ds-_cmd_tbl                *[D.S.]
  6670.     dc.w    mml_do-_cmd_tbl                *[DO]
  6671.     dc.w    mml_dummy-_cmd_tbl            *[DUMMY]
  6672.     dc.w    mml_echo-_cmd_tbl            *[ECHO]
  6673.     dc.w    mml_effect_chorus-_cmd_tbl        *[EFFECT.CHORUS]
  6674.     dc.w    mml_effect_delay-_cmd_tbl        *[EFFECT.DELAY]
  6675.     dc.w    mml_effect_reverb-_cmd_tbl        *[EFFECT.REVERB]
  6676.     dc.w    mml_effect-_cmd_tbl            *[EFFECT]
  6677.     dc.w    mml_embed-_cmd_tbl            *[EMBED]
  6678.     dc.w    mml_end-_cmd_tbl            *[END]
  6679.     dc.w    mml_event-_cmd_tbl            *[EVENT]
  6680.     dc.w    mml_exclusive-_cmd_tbl            *[EXCLUSIOVE]
  6681.     dc.w    mml_fine-_cmd_tbl            *[FINE]
  6682.     dc.w    mml_frequency-_cmd_tbl            *[FREQUENCY]
  6683.     dc.w    mml_gm_system_on-_cmd_tbl        *[GM_SYSTEM_ON]
  6684.     dc.w    mml_gs_chorus-_cmd_tbl            *[GS_CHORUS]
  6685.     dc.w    mml_gs_display-_cmd_tbl            *[GS_DISPLAY]
  6686.     dc.w    mml_gs_drum_setup-_cmd_tbl        *[GS_DRUM_SETUP]
  6687.     dc.w    mml_gs_drum_setup-_cmd_tbl        *[GS_DRUM_PARAMETER]
  6688.     dc.w    mml_gs_drum_name-_cmd_tbl        *[GS_DRUM_NAME]
  6689.     dc.w    mml_gs_reset-_cmd_tbl            *[GS_INIT]
  6690.     dc.w    mml_gs_partial_reserve-_cmd_tbl        *[GS_PARTIAL_RESERVE]
  6691.     dc.w    mml_gs_part_setup-_cmd_tbl        *[GS_PART_SETUP]
  6692.     dc.w    mml_gs_part_setup-_cmd_tbl        *[GS_PART_PARAMETER]
  6693.     dc.w    mml_gs_print-_cmd_tbl            *[GS_PRINT]
  6694.     dc.w    mml_gs_reset-_cmd_tbl            *[GS_RESET]
  6695.     dc.w    mml_gs_reverb-_cmd_tbl            *[GS_REVERB]
  6696.     dc.w    mml_gs_partial_reserve-_cmd_tbl        *[GS_V_RESERVE]
  6697.     dc.w    mml_instrument_id-_cmd_tbl        *[INSTRUMENT_ID]
  6698.     dc.w    mml_measure_jump-_cmd_tbl        *[JUMP]
  6699.     dc.w    mml_k_signature-_cmd_tbl        *[K.SIGN]
  6700.     dc.w    mml_k_remap-_cmd_tbl            *[KEY_REMAP]
  6701.     dc.w    mml_k_signature-_cmd_tbl        *[KEY_SIGNATURE]
  6702.     dc.w    mml_key-_cmd_tbl            *[KEY]
  6703.     dc.w    mml_loop-_cmd_tbl            *[LOOP]
  6704.     dc.w    mml_m1_effect_setup-_cmd_tbl        *[M1_EFFECT_SETUP]
  6705.     dc.w    mml_m1_setup-_cmd_tbl            *[M1_MIDI_CH]
  6706.     dc.w    mml_m1_part_setup-_cmd_tbl        *[M1_PART_SETUP]
  6707.     dc.w    mml_m1_print-_cmd_tbl            *[M1_PRINT]
  6708.     dc.w    mml_m1_setup-_cmd_tbl            *[M1_SETUP]
  6709.     dc.w    mml_master_fader-_cmd_tbl        *[MASTER_FADER]
  6710.     dc.w    mml_measure-_cmd_tbl            *[MEASURE]
  6711.     dc.w    mml_meter-_cmd_tbl            *[METER]
  6712.     dc.w    mml_midi_data-_cmd_tbl            *[MIDI_DATA]
  6713.     dc.w    mml_mt32_common-_cmd_tbl        *[MT32_COMMON]
  6714.     dc.w    mml_mt32_drum_setup-_cmd_tbl        *[MT32_DRUM_SETUP]
  6715.     dc.w    mml_mt32_reset-_cmd_tbl            *[MT32_INIT]
  6716.     dc.w    mml_mt32_partial_reserve-_cmd_tbl    *[MT32_PARTIAL_RESERVE]
  6717.     dc.w    mml_mt32_partial-_cmd_tbl        *[MT32_PARTIAL]
  6718.     dc.w    mml_mt32_part_setup-_cmd_tbl        *[MT32_PART_SETUP]
  6719.     dc.w    mml_mt32_patch-_cmd_tbl            *[MT32_PATCH]
  6720.     dc.w    mml_mt32_partial_reserve-_cmd_tbl    *[MT32_P_RESERVE]
  6721.     dc.w    mml_mt32_print-_cmd_tbl            *[MT32_PRINT]
  6722.     dc.w    mml_mt32_reset-_cmd_tbl            *[MT32_RESET]
  6723.     dc.w    mml_mt32_reverb-_cmd_tbl        *[MT32_REVERB]
  6724.     dc.w    mml_mt32_drum_setup-_cmd_tbl        *[MT32_RHYTHM_SETUP]
  6725.     dc.w    mml_mute-_cmd_tbl            *[MUTE]
  6726.     dc.w    mml_noise-_cmd_tbl            *[NOISE]
  6727.     dc.w    mml_nrpn-_cmd_tbl            *[NRPN]
  6728.     dc.w    mml_opm_lfo-_cmd_tbl            *[OPM.LFO]
  6729.     dc.w    mml_opm-_cmd_tbl            *[OPM]
  6730.     dc.w    mml_panpot-_cmd_tbl            *[PANPOT]
  6731.     dc.w    mml_pattern-_cmd_tbl            *[PATTERN]
  6732.     dc.w    mml_pcm_mode-_cmd_tbl            *[PCM_MODE]
  6733.     dc.w    mml_pitch-_cmd_tbl            *[PITCH]
  6734.     dc.w    mml_poke-_cmd_tbl            *[POKE]
  6735.     dc.w    mml_polyphonic_pressure-_cmd_tbl    *[POLYPHONIC_PRESSURE]
  6736.     dc.w    mml_push_portament-_cmd_tbl        *[PUSH_PORTAMENT]
  6737.     dc.w    mml_pull_portament-_cmd_tbl        *[PULL_PORTAMENT]
  6738.     dc.w    mml_portament-_cmd_tbl            *[PORTAMENT]
  6739.     dc.w    mml_program_bank-_cmd_tbl        *[PROGRAM_BANK]
  6740.     dc.w    mml_timbre_split_switch-_cmd_tbl    *[PROGRAM_SPLIT.SWITCH]
  6741.     dc.w    mml_timbre_split-_cmd_tbl        *[PROGRAM_SPLIT]
  6742.     dc.w    mml_timbre2-_cmd_tbl            *[PROGRAM]
  6743.     dc.w    mml_replay-_cmd_tbl            *[REPLAY]
  6744.     dc.w    mml_roland_exclusive-_cmd_tbl        *[ROLAND_EXCLUSIVE]
  6745.     dc.w    mml_gs_chorus-_cmd_tbl            *[SC55_CHORUS]
  6746.     dc.w    mml_gs_display-_cmd_tbl            *[SC55_DISPLAY]
  6747.     dc.w    mml_gs_drum_setup-_cmd_tbl        *[SC55_DRUM_SETUP]
  6748.     dc.w    mml_gs_drum_setup-_cmd_tbl        *[SC55_DRUM_PARAMETER]
  6749.     dc.w    mml_gs_drum_name-_cmd_tbl        *[SC55_DRUM_NAME]
  6750.     dc.w    mml_gs_reset-_cmd_tbl            *[SC55_INIT]
  6751.     dc.w    mml_gs_partial_reserve-_cmd_tbl        *[SC55_PARTIAL_RESERVE]
  6752.     dc.w    mml_gs_part_setup-_cmd_tbl        *[SC55_PART_SETUP]
  6753.     dc.w    mml_gs_part_setup-_cmd_tbl        *[SC55_PART_PARAMETER]
  6754.     dc.w    mml_gs_print-_cmd_tbl            *[SC55_PRINT]
  6755.     dc.w    mml_gs_reverb-_cmd_tbl            *[SC55_REVERB]
  6756.     dc.w    mml_gs_reset-_cmd_tbl            *[SC55_RESET]
  6757.     dc.w    mml_gs_partial_reserve-_cmd_tbl        *[SC55_V_RESERVE]
  6758.     dc.w    mml_sc88_mode-_cmd_tbl            *[SC88_MODE_SET]
  6759.     dc.w    mml_sc88_mode-_cmd_tbl            *[SC88_MODE]
  6760.     dc.w    mml_sc88_reverb-_cmd_tbl        *[SC88_REVERB]
  6761.     dc.w    mml_sc88_chorus-_cmd_tbl        *[SC88_CHORUS]
  6762.     dc.w    mml_sc88_delay-_cmd_tbl            *[SC88_DELAY]
  6763.     dc.w    mml_sc88_equalizer-_cmd_tbl        *[SC88_EQUALIZER]
  6764.     dc.w    mml_sc88_part_setup-_cmd_tbl        *[SC88_PART_SETUP]
  6765.     dc.w    mml_sc88_part_setup-_cmd_tbl        *[SC88_PART_PARAMETER]
  6766.     dc.w    mml_sc88_drum_setup-_cmd_tbl        *[SC88_DRUM_SETUP]
  6767.     dc.w    mml_sc88_drum_setup-_cmd_tbl        *[SC88_DRUM_PARAMETER]
  6768.     dc.w    mml_sc88_drum_name-_cmd_tbl        *[SC88_DRUM_NAME]
  6769.     dc.w    mml_sc88_user_inst-_cmd_tbl        *[SC88_USER_INST]
  6770.     dc.w    mml_sc88_user_drum-_cmd_tbl        *[SC88_USER_DRUM]
  6771.     dc.w    mml_segno-_cmd_tbl            *[SEGNO]
  6772.     dc.w    mml_send_to_m1-_cmd_tbl            *[SEND_TO_M1]
  6773.     dc.w    mml_slot_separation-_cmd_tbl        *[SLOT_SEPARATION]
  6774.     dc.w    mml_stop-_cmd_tbl            *[STOP]
  6775.     dc.w    mml_synchronize-_cmd_tbl        *[SYNCHRONIZE]
  6776.     dc.w    mml_tempo-_cmd_tbl            *[TEMPO]
  6777.     dc.w    mml_tie_mode-_cmd_tbl            *[TIE_MODE]
  6778.     dc.w    mml_timer-_cmd_tbl            *[TIMER]
  6779.     dc.w    mml_program_bank-_cmd_tbl        *[TIMBRE_BANK]
  6780.     dc.w    mml_timbre_split_switch-_cmd_tbl    *[TIMBRE_SPLIT.SWITCH]
  6781.     dc.w    mml_timbre_split-_cmd_tbl        *[TIMBRE_SPLIT]
  6782.     dc.w    mml_timbre2-_cmd_tbl            *[TIMBRE]
  6783.     dc.w    mml_tocoda-_cmd_tbl            *[TOCODA]
  6784.     dc.w    mml_track_delay-_cmd_tbl        *[TRACK_DELAY]
  6785.     dc.w    mml_track_fader-_cmd_tbl        *[TRACK_FADER]
  6786.     dc.w    mml_track_mode-_cmd_tbl            *[TRACK_MODE]
  6787.     dc.w    mml_u220_common-_cmd_tbl        *[U220_COMMON]
  6788.     dc.w    mml_u220_drum_inst-_cmd_tbl        *[U220_DRUM_INST]
  6789.     dc.w    mml_u220_drum_setup-_cmd_tbl        *[U220_DRUM_SETUP]
  6790.     dc.w    mml_u220_part_setup-_cmd_tbl        *[U220_PART_SETUP]
  6791.     dc.w    mml_u220_print-_cmd_tbl            *[U220_PRINT]
  6792.     dc.w    mml_u220_setup-_cmd_tbl            *[U220_SETUP]
  6793.     dc.w    mml_u220_timbre-_cmd_tbl        *[U220_TIMBRE]
  6794.     dc.w    mml_velocity_deepen-_cmd_tbl        *[VELOCITY.DEEPEN]
  6795.     dc.w    mml_velocity_delay-_cmd_tbl        *[VELOCITY.DELAY]
  6796.     dc.w    mml_velocity_depth-_cmd_tbl        *[VELOCITY.DEPTH]
  6797.     dc.w    mml_velocity_depth-_cmd_tbl        *[VELOCITY.LEVEL]
  6798.     dc.w    mml_velocity_origin-_cmd_tbl        *[VELOCITY.ORIGIN]
  6799.     dc.w    mml_velocity_phase-_cmd_tbl        *[VELOCITY.PHASE]
  6800.     dc.w    mml_velocity_speed-_cmd_tbl        *[VELOCITY.SPEED]
  6801.     dc.w    mml_velocity_switch-_cmd_tbl        *[VELOCITY.SWITCH]
  6802.     dc.w    mml_velocity_sync-_cmd_tbl        *[VELOCITY.SYNC]
  6803.     dc.w    mml_velocity_waveform-_cmd_tbl        *[VELOCITY.WAVEFORM]
  6804.     dc.w    mml_velocity-_cmd_tbl            *[VELOCITY]
  6805.     dc.w    mml_vibrato_deepen-_cmd_tbl        *[VIBRATO.DEEPEN]
  6806.     dc.w    mml_vibrato_delay-_cmd_tbl        *[VIBRATO.DELAY]
  6807.     dc.w    mml_vibrato_depth-_cmd_tbl        *[VIBRATO.DEPTH]
  6808.     dc.w    mml_vibrato_mode-_cmd_tbl        *[VIBRATO.MODE]
  6809.     dc.w    mml_vibrato_speed-_cmd_tbl        *[VIBRATO.SPEED]
  6810.     dc.w    mml_vibrato_switch-_cmd_tbl        *[VIBRATO.SWITCH]
  6811.     dc.w    mml_vibrato_sync-_cmd_tbl        *[VIBRATO.SYNC]
  6812.     dc.w    mml_vibrato_waveform-_cmd_tbl        *[VIBRATO.WAVEFORM]
  6813.     dc.w    mml_voice_reserve-_cmd_tbl        *[VOICE_RESERVE]
  6814.     dc.w    mml_volume-_cmd_tbl            *[VOLUME]
  6815.     dc.w    mml_yamaha_exclusive-_cmd_tbl        *[YAMAHA_BULKDUMP]
  6816.     dc.w    mml_yamaha_exclusive-_cmd_tbl        *[YAMAHA_EXCLUSIVE]
  6817.     dc.w    mml_fine-_cmd_tbl            *[^]
  6818. _cmd_tbl_end:
  6819. mml_dc:
  6820.     moveq.l    #DC_zmd,d1
  6821.     bra    @f
  6822. mml_do:
  6823.     bsr    skip_spc
  6824.     cmp.l    a4,d4
  6825.     bls    m_illegal_command_line    *']'がない
  6826.     cmpi.b    #']',(a4)
  6827.     beq    @f
  6828.     move.l    d7,a4            *ポルタメントとみなす
  6829.     addq.w    #4,sp
  6830.     bra    mml_port_
  6831. @@:
  6832.     moveq.l    #DO_zmd,d1
  6833.     bra    @f
  6834. mml_jump:
  6835.     tst.b    jump_cmd_ctrl-work(a6)
  6836.     beq    exit_seq_cmd
  6837.     moveq.l    #J1_zmd,d1
  6838.     bset.b    #6,compile_status-work(a6)    *[@]/[!]を使用したことをマーク
  6839.     bra    @f
  6840. mml_jump2:
  6841.     tst.b    jump_cmd_ctrl-work(a6)
  6842.     beq    exit_seq_cmd
  6843.     moveq.l    #J2_zmd,d1
  6844.     bset.b    #6,compile_status-work(a6)    *[@]/[!]を使用したことをマーク
  6845. @@:
  6846.     moveq.l    #seq_cmd_zmd,d0        *command code
  6847.     bsr    do_wrt_trk_b
  6848.     move.l    d1,d0
  6849.     bsr    do_wrt_trk_b
  6850.     moveq.l    #0,d0
  6851.     bra    do_wrt_trk_b
  6852. exit_seq_cmd:
  6853.     rts
  6854.  
  6855. mml_segno:                *[segno]
  6856.     moveq.l    #0,d1            *default no.
  6857.     bsr    chk_num
  6858.     bmi    @f            *[segno]は[segno0]とみなす
  6859.     bsr    get_num            *[segno n]ケース
  6860. @@:
  6861.     moveq.l    #segno_zmd,d0
  6862.     bsr    do_wrt_trk_b
  6863.     bsr    push_segno_addr        *アドレス登録
  6864.     moveq.l    #0,d0
  6865.     bra    do_wrt_trk_l
  6866.  
  6867. mml_ds:                    *[d.s.]
  6868.     moveq.l    #0,d1            *default no.
  6869.     bsr    chk_num
  6870.     bmi    @f            *[d.s.]は[d.s.0]とみなす
  6871.     bsr    get_num            *[d.s. n]ケース
  6872. @@:
  6873.     moveq.l    #ds_zmd,d0
  6874.     bsr    do_wrt_trk_b        *cmd
  6875.     bsr    pop_segno_addr        *次の[flag]アドレスを[segno]が指すようにする
  6876. mlds00:
  6877.     bsr    rgst_flag_map        *[loop]処理時に初期化するワークとして登録
  6878.     moveq.l    #0,d0
  6879.     bsr    do_wrt_trk_b        *flag
  6880.     move.l    a1,d0
  6881.     move.l    tpt_now(a5),d1
  6882.     sub.l    a1,d1
  6883.     subq.l    #5,d1            *sizeof[offset(l)]+1=5
  6884.     add.l    tpt_addr(a5),a1        *d1.l=segnoからd.s.フラグまでのオフセット
  6885.     rept    4
  6886.     rol.l    #8,d1
  6887.     move.b    d1,(a1)+
  6888.     endm
  6889.     sub.l    tpt_now(a5),d0        *d0.l=d.s.からsegnoの次までのオフセット
  6890.     bra    do_wrt_trk_l        *offset
  6891.  
  6892. mml_coda:                *[coda]
  6893.     moveq.l    #0,d1            *default no.
  6894.     bsr    chk_num
  6895.     bmi    @f            *[coda]は[coda0]とみなす
  6896.     bsr    get_num            *[coda n]ケース
  6897. @@:
  6898.     moveq.l    #coda_zmd,d0
  6899.     bsr    do_wrt_trk_b
  6900.     bsr    pop_coda_addr
  6901.     move.l    a1,d0
  6902.     sub.l    tpt_now(a5),d0
  6903.     subq.l    #4,d0            *d0.l=codaからtoCodaフラグまでのオフセット
  6904.     bsr    do_wrt_trk_l
  6905.     addq.l    #1,a1            *skip toCodaフラグ
  6906.     move.l    a1,d1
  6907.     addq.l    #4,d1
  6908.     move.l    tpt_now(a5),d0
  6909.     sub.l    d1,d0            *d0.l=codaからtoCodaフラグまでの距離
  6910.     add.l    tpt_addr(a5),a1
  6911.     rept    4
  6912.     rol.l    #8,d0
  6913.     move.b    d0,(a1)+
  6914.     endm
  6915.     rts
  6916.  
  6917. mml_tocoda:                *[tocoda]
  6918.     moveq.l    #0,d1            *default no.
  6919.     bsr    chk_num
  6920.     bmi    @f            *[tocoda]は[tocoda0]とみなす
  6921.     bsr    get_num            *[tocoda n]ケース
  6922. @@:
  6923.     moveq.l    #tocoda_zmd,d0
  6924.     bsr    do_wrt_trk_b        *cmd
  6925.     bsr    push_coda_addr        *次の[flag]アドレスを[coda]が指すようにする
  6926.     bsr    rgst_flag_map        *[loop]処理時に初期化するワークとして登録
  6927.     moveq.l    #0,d0
  6928.     bsr    do_wrt_trk_b        *flag
  6929.     moveq.l    #0,d0
  6930.     bra    do_wrt_trk_l        *offset
  6931.  
  6932. reglist    reg    d0-d2/a2
  6933. push_segno_addr:            *SGENOのオフセットアドレスのセット
  6934.     * < d1.l=segno number
  6935.     movem.l    reglist,-(sp)
  6936.     moveq.l    #segno_zmd,d2
  6937.     bra    @f
  6938. push_coda_addr:                *CODAのオフセットアドレスのセット
  6939.     * < d1.l=coda number
  6940.     movem.l    reglist,-(sp)
  6941.     moveq.l    #coda_zmd,d2
  6942. @@:
  6943.     move.l    tpt_sgcd_max(a5),d0    *ここがゼロならばワークを確保しに行く
  6944.     bne    @f
  6945.     bsr    get_sgcd_work        *segno/coda処理ワーク確保/> d0.l=tpt_sgcd_max
  6946. @@:
  6947.     move.l    tpt_sgcd_addr(a5),a2
  6948.     add.l    tpt_sgcd_n(a5),a2
  6949.     move.l    d2,(a2)+        *type(segno/coda)
  6950.     move.l    d1,(a2)+        *number ID
  6951.     move.l    tpt_now(a5),(a2)+    *copmiled data addr.
  6952.     add.l    #sgcd_wksz,tpt_sgcd_n(a5)
  6953.     cmp.l    tpt_sgcd_n(a5),d0
  6954.     bhi    @f
  6955.     bsr    spread_sgcd_work    *segno/coda処理ワーク拡張
  6956. @@:
  6957.     movem.l    (sp)+,reglist
  6958.     rts
  6959.  
  6960. get_sgcd_work:                *segno/coda処理ワーク確保
  6961.     * > d0.l=tpt_sgcd_max
  6962. reglist    reg    d1-d3/a0-a1
  6963.     movem.l    reglist,-(sp)
  6964.     move.l    #sgcd_wksz*8,d2
  6965.     move.l    #ID_TEMP,d3
  6966.     jsr    get_mem-work(a6)
  6967.     tst.l    d0
  6968.     bmi    m_out_of_memory
  6969.     move.l    a0,tpt_sgcd_addr(a5)
  6970.     move.l    d2,tpt_sgcd_max(a5)    *work limit addr
  6971.     move.l    d2,d0
  6972.     clr.l    tpt_sgcd_n(a5)        *ptr
  6973.     movem.l    (sp)+,reglist
  6974.     rts
  6975.  
  6976. spread_sgcd_work:            *segno/coda処理ワーク拡張
  6977. reglist    reg    d0-d2/a0-a1
  6978.     movem.l    reglist,-(sp)
  6979.     move.l    tpt_sgcd_addr(a5),a1
  6980.     move.l    tpt_sgcd_max(a5),d2
  6981.     add.l    #sgcd_wksz*8,d2
  6982.     jsr    enlarge_mem-work(a6)
  6983.     tst.l    d0
  6984.     bmi    m_out_of_memory
  6985.     move.l    a0,tpt_sgcd_addr(a5)
  6986.     move.l    d2,tpt_sgcd_max(a5)    *work limit addr
  6987.     movem.l    (sp)+,reglist
  6988.     rts
  6989.  
  6990. reglist    reg    d0-d2/a2
  6991. pop_segno_addr:                *segnoアドレスまでのオフセット取りだし
  6992.     * < d1.l=segno number
  6993.     * > a1.l=next cmd address of segno
  6994.     movem.l    reglist,-(sp)
  6995.     moveq.l    #segno_zmd,d2
  6996.     bra    @f
  6997. pop_coda_addr:                *codaアドレスまでのオフセット取りだし
  6998.     * < d1.l=coda number
  6999.     * > a1.l=next cmd address of coda
  7000.     movem.l    reglist,-(sp)
  7001.     moveq.l    #coda_zmd,d2
  7002. @@:
  7003.     tst.l    tpt_sgcd_max(a5)
  7004.     beq    m_disorderly_repeat_structure
  7005.     move.l    tpt_sgcd_n(a5),d3
  7006.     beq    m_disorderly_repeat_structure
  7007.     move.l    tpt_sgcd_addr(a5),a2    *repeat work base addr.
  7008. ppsca_lp:
  7009.     cmp.l    s_sgcd_id(a2),d2
  7010.     bne    ppsca_next        *typeが違う
  7011.     cmp.l    s_sgcd_no(a2),d1
  7012.     bne    ppsca_next        *IDが違う
  7013.     move.l    s_sgcd_addr(a2),a1
  7014. @@:
  7015.     move.l    s_sgcd_id+sgcd_wksz(a2),s_sgcd_id(a2)
  7016.     move.l    s_sgcd_no+sgcd_wksz(a2),s_sgcd_no(a2)
  7017.     move.l    s_sgcd_addr+sgcd_wksz(a2),s_sgcd_addr(a2)
  7018.     lea    sgcd_wksz(a2),a2
  7019.     sub.l    #sgcd_wksz,d3
  7020.     bne    @b
  7021.     sub.l    #sgcd_wksz,tpt_sgcd_n(a5)    *このリピート構造は完結
  7022.     movem.l    (sp)+,reglist
  7023.     rts
  7024. ppsca_next:
  7025.     lea    sgcd_wksz(a2),a2
  7026.     sub.l    #sgcd_wksz,d3
  7027.     bne    ppsca_lp
  7028.     bra    m_disorderly_repeat_structure    *ポップ不可
  7029.  
  7030. mml_fine:                *[fine]
  7031.     moveq.l    #fine_zmd,d0
  7032.     bra    do_wrt_trk_b
  7033.  
  7034. mml_loop:                *[loop]
  7035.     moveq.l    #loop_zmd,d0
  7036.     bsr    do_wrt_trk_b
  7037.     tst.l    tpt_fgmap_max(a5)
  7038.     beq    exit_mllp        *初期化マップ必要なし
  7039.     move.l    tpt_fgmap_n(a5),d2
  7040.     beq    exit_mllp        *初期化マップ必要なし
  7041.     move.l    tpt_fgmap_addr(a5),a1
  7042. @@:
  7043.     move.l    (a1)+,d0
  7044.     sub.l    tpt_now(a5),d0
  7045.     subq.l    #4,d0            *オフセット格納領域のサイズ
  7046.     bsr    do_wrt_trk_l
  7047.     subq.l    #4,d2
  7048.     bne    @b
  7049. exit_mllp:
  7050.     moveq.l    #0,d0            *end mark
  7051.     bsr    do_wrt_trk_l
  7052.     clr.l    tpt_fgmap_n(a5)        *余り意味はないが
  7053.     rts
  7054.  
  7055. mml_end:
  7056.     tst.b    jump_cmd_ctrl-work(a6)    *m_debug()コマンドによるスイッチング
  7057.     beq    mml_lp
  7058.     moveq.l    #play_end_zmd,d0    *終了
  7059.     bra    do_wrt_trk_b
  7060.  
  7061. mml_compile_break_off:            *コンパイル中断
  7062.     tst.b    jump_cmd_ctrl-work(a6)    *m_debug()コマンドによるスイッチング
  7063.     beq    mml_lp
  7064.     bchg.b    #c_break,tpt_mode_flg(a5)
  7065.     rts
  7066.  
  7067. reglist    reg    d0/a2
  7068. rgst_flag_map:                *CODA/SGENOのフラグワーク位置を登録
  7069.     movem.l    reglist,-(sp)
  7070.     move.l    tpt_fgmap_max(a5),d0    *ここがゼロならばワークを確保しに行く
  7071.     bne    @f
  7072.     bsr    get_fgmap_work        *登録スペース確保
  7073. @@:
  7074.     move.l    tpt_fgmap_addr(a5),a2
  7075.     add.l    tpt_fgmap_n(a5),a2
  7076.     move.l    tpt_now(a5),(a2)    *copmiled data addr.
  7077.     addq.l    #4,tpt_fgmap_n(a5)
  7078.     cmp.l    tpt_fgmap_n(a5),d0
  7079.     bhi    @f
  7080.     bsr    spread_fgmap_work    *登録スペース拡張
  7081. @@:
  7082.     movem.l    (sp)+,reglist
  7083.     rts
  7084.  
  7085. get_fgmap_work:            *CODA/SGENOのフラグワーク位置を登録するためのワークを確保
  7086. reglist    reg    d0-d3/a0-a1
  7087.     movem.l    reglist,-(sp)
  7088.     move.l    #4*8,d2
  7089.     move.l    #ID_TEMP,d3
  7090.     jsr    get_mem-work(a6)
  7091.     tst.l    d0
  7092.     bmi    m_out_of_memory
  7093.     move.l    a0,tpt_fgmap_addr(a5)
  7094.     move.l    d2,tpt_fgmap_max(a5)    *work limit addr
  7095.     clr.l    tpt_fgmap_n(a5)        *ptr
  7096.     movem.l    (sp)+,reglist
  7097.     rts
  7098.  
  7099. spread_fgmap_work:        *CODA/SGENOのフラグワーク位置を登録するためのワークを拡張
  7100. reglist    reg    d0-d2/a0-a1
  7101.     movem.l    reglist,-(sp)
  7102.     move.l    tpt_fgmap_addr(a5),a1
  7103.     move.l    tpt_fgmap_max(a5),d2
  7104.     add.l    #4*8,d2
  7105.     jsr    enlarge_mem-work(a6)
  7106.     tst.l    d0
  7107.     bmi    m_out_of_memory
  7108.     move.l    a0,tpt_fgmap_addr(a5)
  7109.     move.l    d2,tpt_fgmap_max(a5)    *work limit addr
  7110.     movem.l    (sp)+,reglist
  7111.     rts
  7112.  
  7113. mml_k_remap:                *[KEY_REMAP]
  7114.     bsr    skip_spc        *オクターブスイッチの考慮その1
  7115.     cmp.l    a4,d4
  7116.     bls    m_illegal_command_line
  7117.     lea    krmp_strv-work(a6),a1
  7118.     bsr    get_com_no
  7119.     bpl    init_tptnttbl
  7120.     bsr    get_note_2way_split    *>d1.l=note
  7121.     move.l    d1,d2
  7122.     bsr    skip_sep
  7123.     cmp.l    a4,d4
  7124.     bls    m_illegal_command_line
  7125.     bsr    get_note_2way_split    *>d1.l=note
  7126.     lea    tpt_note_tbl(a5),a1
  7127.     move.b    d1,(a1,d2.l)
  7128.     rts
  7129.  
  7130. init_tptnttbl:
  7131.     movem.l    d0-d1/a1,-(sp)
  7132.     lea    tpt_note_tbl(a5),a1
  7133.     moveq.l    #0,d0
  7134.     moveq.l    #128-1,d1
  7135. @@:
  7136.     move.b    d0,(a1)+
  7137.     addq.w    #1,d0
  7138.     dbra    d1,@b
  7139.     movem.l    (sp)+,d0-d1/a1
  7140.     rts
  7141.  
  7142. mml_k_signature:        *デフォルト調号指定
  7143.     lea    KEY_tbl-work(a6),a1
  7144.     bsr    get_com_no
  7145.     bmi    mmlksign0
  7146.     lsl.w    #3,d0
  7147.     lea    mks_tbl(pc,d0.w),a1
  7148.     lea    tpt_key_sig(a5),a2
  7149.     move.l    (a1)+,(a2)+
  7150.     move.l    (a1)+,(a2)+
  7151.     rts
  7152. mks_tbl:    *     A, B, C, D, E, F, G, *
  7153.         dc.b    00,00,00,00,00,00,00,00    *CMAJOR
  7154.         dc.b    00,00,00,00,00,01,00,00    *GMAJOR
  7155.         dc.b    00,00,01,00,00,01,00,00    *DMAJOR
  7156.         dc.b    00,00,01,00,00,01,01,00    *AMAJOR
  7157.         dc.b    00,00,01,01,00,01,01,00    *EMAJOR
  7158.         dc.b    01,00,01,01,00,01,01,00    *BMAJOR
  7159.         dc.b    01,00,01,01,01,01,01,00    *F+MAJOR
  7160.         dc.b    01,00,01,01,01,01,01,00    *F#MAJOR
  7161.         dc.b    01,01,01,01,01,01,01,00    *C+MAJOR
  7162.         dc.b    01,01,01,01,01,01,01,00    *C#MAJOR
  7163.  
  7164.         dc.b    00,00,00,00,00,00,00,00    *CMAJOR
  7165.         dc.b    00,-1,00,00,00,00,00,00    *FMAJOR
  7166.         dc.b    00,-1,00,00,-1,00,00,00    *B-MAJOR
  7167.         dc.b    00,-1,00,00,-1,00,00,00    *BbMAJOR
  7168.         dc.b    -1,-1,00,00,-1,00,00,00    *E-MAJOR
  7169.         dc.b    -1,-1,00,00,-1,00,00,00    *EbMAJOR
  7170.         dc.b    -1,-1,00,-1,-1,00,00,00    *A-MAJOR
  7171.         dc.b    -1,-1,00,-1,-1,00,00,00    *AbMAJOR
  7172.         dc.b    -1,-1,00,-1,-1,00,-1,00    *D-MAJOR
  7173.         dc.b    -1,-1,00,-1,-1,00,-1,00    *DbMAJOR
  7174.         dc.b    -1,-1,-1,-1,-1,00,-1,00    *G-MAJOR
  7175.         dc.b    -1,-1,-1,-1,-1,00,-1,00    *GbMAJOR
  7176.         dc.b    -1,-1,-1,-1,-1,-1,-1,00    *C-MAJOR
  7177.         dc.b    -1,-1,-1,-1,-1,-1,-1,00    *CbMAJOR
  7178.  
  7179.         dc.b    00,00,00,00,00,00,00,00    *AMINOR
  7180.         dc.b    00,00,00,00,00,01,00,00    *EMINOR
  7181.         dc.b    00,00,01,00,00,01,00,00    *BMINOR
  7182.         dc.b    00,00,01,00,00,01,01,00    *F+MINOR
  7183.         dc.b    00,00,01,00,00,01,01,00    *F+MINOR
  7184.         dc.b    00,00,01,01,00,01,01,00    *C+MINOR
  7185.         dc.b    00,00,01,01,00,01,01,00    *C#MINOR
  7186.         dc.b    01,00,01,01,00,01,01,00    *G+MINOR
  7187.         dc.b    01,00,01,01,00,01,01,00    *G#MINOR
  7188.         dc.b    01,00,01,01,01,01,01,00    *D+MINOR
  7189.         dc.b    01,00,01,01,01,01,01,00    *D#MINOR
  7190.         dc.b    01,01,01,01,01,01,01,00    *A+MINOR
  7191.         dc.b    01,01,01,01,01,01,01,00    *A#MINOR
  7192.  
  7193.         dc.b    00,00,00,00,00,00,00,00    *AMINOR
  7194.         dc.b    00,-1,00,00,00,00,00,00    *DMINOR
  7195.         dc.b    00,-1,00,00,-1,00,00,00    *GMINOR
  7196.         dc.b    -1,-1,00,00,-1,00,00,00    *CMINOR
  7197.         dc.b    -1,-1,00,-1,-1,00,00,00    *FMINOR
  7198.         dc.b    -1,-1,00,-1,-1,00,-1,00    *B-MINOR
  7199.         dc.b    -1,-1,00,-1,-1,00,-1,00    *BbMINOR
  7200.         dc.b    -1,-1,-1,-1,-1,00,-1,00    *E-MINOR
  7201.         dc.b    -1,-1,-1,-1,-1,00,-1,00    *EbMINOR
  7202.         dc.b    -1,-1,-1,-1,-1,-1,-1,00    *A-MINOR
  7203.         dc.b    -1,-1,-1,-1,-1,-1,-1,00    *AbMINOR
  7204.  
  7205. mmlksign0:
  7206.     moveq.l    #0,d0
  7207.     moveq.l    #0,d3
  7208.     lea    tpt_key_sig+8(a5),a2
  7209.     move.l    d3,-(a2)
  7210.     move.l    d3,-(a2)    *initialize
  7211. ksi_lp:
  7212.     bsr    skip_spc
  7213.     cmp.l    a4,d4
  7214.     bls    m_illegal_command_line    *']'がない
  7215.     move.b    (a4)+,d0
  7216.     cmpi.b    #' ',d0
  7217.     bcs    m_illegal_command_line    *']'がない
  7218.     cmpi.b    #']',d0
  7219.     beq    exit_ksi
  7220.     cmpi.b    #'+',d0
  7221.     beq    @f
  7222.     cmpi.b    #'#',d0
  7223.     bne    ksi_minus?
  7224. @@:                *case #
  7225.     addq.b    #1,d3
  7226.     bra    ksi_lp
  7227. ksi_minus?:
  7228.     cmpi.b    #'-',d0
  7229.     bne    @f
  7230.     subq.b    #1,d3
  7231.     bra    ksi_lp
  7232. @@:
  7233.     cmpi.b    #' ',d0
  7234.     beq    ks_sep
  7235.     cmpi.b    #',',d0
  7236.     bne    @f
  7237. ks_sep:
  7238.     moveq.l    #0,d3
  7239.     bra    ksi_lp
  7240. @@:
  7241.     jsr    mk_capital-work(a6)
  7242.     sub.b    #'A',d0
  7243.     bmi    m_unexpected_operand
  7244.     cmpi.w    #6,d0
  7245.     bhi    m_unexpected_operand
  7246.     move.b    d3,(a2,d0.w)    *set
  7247.     bra    ksi_lp
  7248. exit_ksi:
  7249.     subq.w    #1,a4
  7250.     rts
  7251.  
  7252. mml_pattern:                *[PATTERN]    パターン指定
  7253.     moveq.l    #']',d1
  7254.     bsr    get_pattern_name    *> d0=last character,d3=str len,temp_buffer=name str
  7255.     cmp.b    d0,d1            *文字列の最後は必ず']'でなければならない
  7256.     bne    m_illegal_command_line
  7257.     subq.w    #1,a4            *辻褄合わせ
  7258.                     *指定パターン名の検索
  7259.     bsr    find_pattern_name    *>a2.l=exact address
  7260.     beq    m_undefined_pattern    *未定義のパターンを指定した
  7261.     moveq.l    #gosub_zmd,d0
  7262.     bsr    do_wrt_trk_b
  7263.     moveq.l    #-1,d0            *track number=-1:pattern track
  7264.     bsr    do_wrt_trk_w
  7265.     move.l    (a2),d0
  7266.     bra    do_wrt_trk_l        *パターンが存在するoffsetアドレス
  7267.  
  7268. mml_pcm_mode:                *[PCM_MODE]
  7269.     bsr    chk_num
  7270.     bpl    @f
  7271.     lea    rhythm_timbre_tone-work(a6),a1
  7272.     bsr    get_com_no        *0:rhythm,1:timbre,2:tone
  7273.     bmi    m_illegal_mode_value
  7274.     move.l    d0,d1
  7275.     beq    do_wrt_mpm
  7276.     subq.l    #1,d1
  7277.     beq    mpm00
  7278.     moveq.l    #0,d1
  7279.     bra    do_wrt_mpm
  7280. @@:
  7281.     moveq.l    #0,d1
  7282.     bsr    chk_num
  7283.     bmi    do_wrt_mpm
  7284.     bsr    get_num
  7285.     tst.l    d1
  7286.     beq    do_wrt_mpm
  7287. mpm00:
  7288.     moveq.l    #4,d1            *b_vtune_mode
  7289. do_wrt_mpm:
  7290.     moveq.l    #pcm_mode_zmd,d0
  7291.     bsr    do_wrt_trk_b
  7292.     bra    wrt_data_d1
  7293.  
  7294. mml_embed:                *[EMBED]    パターン指定
  7295.     moveq.l    #']',d1
  7296.     bsr    get_pattern_name    *> d0=last character,d3=str len,temp_buffer=name str
  7297.     cmp.b    d0,d1            *文字列の最後は必ず']'でなければならない
  7298.     bne    m_illegal_command_line
  7299.     subq.w    #1,a4            *辻褄合わせ
  7300.                     *指定パターン名の検索
  7301.     bsr    find_pattern_name    *>a2.l=exact address
  7302.     beq    m_undefined_pattern    *未定義のパターンを指定した
  7303.     move.l    (a2)+,d0        *offset
  7304.     move.l    (a2)+,d2        *size
  7305.     moveq.l    #-1,d1
  7306.     bsr    get_trk_addr        *>a2.l=addr
  7307.     move.l    tpt_addr(a2),a2
  7308.     add.l    d0,a2
  7309. @@:
  7310.     move.b    (a2)+,d0
  7311.     bsr    do_wrt_trk_b
  7312.     subq.l    #1,d2
  7313.     bne    @b
  7314.     rts
  7315.  
  7316. mml_track_delay:        *[TRACK_DELAY n]
  7317.     bsr    chk_num
  7318.     bmi    @f
  7319.     bsr    get_num
  7320.     cmpi.l    #max_note_len,d1
  7321.     bhi    m_delay_too_long
  7322.     moveq.l    #track_delay_zmd,d0
  7323.     bsr    do_wrt_trk_b
  7324.     move.l    d1,d0
  7325.     bsr    consider_trkfrq_st
  7326.     bra    do_wrt_trk_v
  7327.  
  7328. mml_comment:                *[COMMENT]
  7329.     moveq.l    #skip_zmd,d0
  7330.     bsr    do_wrt_trk_b
  7331.     moveq.l    #0,d0            *mode=0(offset)
  7332.     bsr    do_wrt_trk_b
  7333.     move.l    tpt_now(a5),d5        *あとでoffsetを格納するため
  7334.     moveq.l    #0,d0
  7335.     bsr    do_wrt_trk_l        *スキップ幅予約
  7336. seq_string_param:
  7337.     cmp.l    a4,d4
  7338.     bls    m_illegal_command_line
  7339.     move.b    (a4)+,d0        *最初の1文字のSPC/TABなどはスキップ
  7340.     cmpi.b    #' ',d0
  7341.     beq    mmlcmtlp        *spc
  7342.     cmpi.b    #$09,d0
  7343.     beq    mmlcmtlp        *tab
  7344.     subq.w    #1,a4
  7345. mmlcmtlp:                    *']'を発見するまで文字列を格納
  7346.     cmp.l    a4,d4
  7347.     bls    m_illegal_command_line
  7348.     move.b    (a4)+,d0
  7349.     bsr    chk_kanji
  7350.     bpl    @f
  7351.     cmp.l    a4,d4
  7352.     bls    m_kanji_break_off
  7353.     move.b    (a4)+,d0
  7354.     bsr    do_wrt_trk_b
  7355.     bra    mmlcmtlp
  7356. @@:
  7357.     cmpi.b    #']',d0            *endcode
  7358.     beq    @f
  7359.     bsr    do_wrt_trk_b
  7360.     bra    mmlcmtlp
  7361. @@:
  7362.     subq.w    #1,a4            *辻褄あわせ 97/4/10
  7363.     move.l    d5,d1
  7364.     addq.l    #4,d1
  7365.     move.l    tpt_now(a5),d0
  7366.     sub.l    d1,d0
  7367.     move.l    tpt_addr(a5),a1        *文字列長=SKIP幅をセット
  7368.     add.l    d5,a1
  7369.     rol.l    #8,d0
  7370.     move.b    d0,(a1)+
  7371.     rol.l    #8,d0
  7372.     move.b    d0,(a1)+
  7373.     rol.l    #8,d0
  7374.     move.b    d0,(a1)+
  7375.     rol.l    #8,d0
  7376.     move.b    d0,(a1)+
  7377.     rts
  7378.  
  7379. mml_event:                *[EVENT]
  7380.     moveq.l    #event_zmd,d0
  7381.     bsr    do_wrt_trk_b
  7382.     move.l    tpt_now(a5),d5        *あとでoffsetを格納するため
  7383.     moveq.l    #0,d0
  7384.     bsr    do_wrt_trk_l        *スキップ幅(SIZE)予約
  7385.     bsr    chk_num            *get category
  7386.     bpl    @f
  7387.     lea    category_strv-work(a6),a1
  7388.     bsr    get_com_no
  7389.     bmi    m_illegal_category_event
  7390.     move.l    d0,d1
  7391.     bra    get_evntcls
  7392. @@:
  7393.     bsr    get_num
  7394.     cmpi.l    #255,d1
  7395.     bhi    m_illegal_category_event
  7396.     move.l    d1,d0
  7397. get_evntcls:
  7398.     move.l    d0,d3            *カテゴリ保存
  7399.     bsr    do_wrt_trk_b        *category
  7400.     bsr    skip_sep
  7401.     bsr    chk_num
  7402.     bpl    @f
  7403.     add.w    d1,d1
  7404.     move.w    classstrvtbl(pc,d1.l),d1
  7405.     lea    classstrvtbl(pc,d1.l),a1
  7406.     bsr    get_com_no
  7407.     bmi    m_unknown_event_class
  7408.     bra    get_evntstr
  7409. classstrvtbl:
  7410.     dc.w    class0_strv-classstrvtbl    *category=0のクラス名テーブル
  7411.     dc.w    class1_strv-classstrvtbl    *category=1のクラス名テーブル
  7412.     dc.w    class2_strv-classstrvtbl    *category=2のクラス名テーブル
  7413. @@:                    *get class
  7414.     bsr    get_num
  7415.     cmpi.l    #255,d1
  7416.     bhi    m_unknown_event_class
  7417.     move.l    d1,d0
  7418. get_evntstr:
  7419.     bsr    do_wrt_trk_b        *class
  7420.     bsr    skip_sep
  7421.     moveq.l    #0,d0
  7422.     bsr    do_wrt_trk_w        *dummy(w)
  7423.     bsr    get_str_zmd        *>d1.l=文字列長
  7424.     tst.l    d3
  7425.     bne    1f            *0:word以外はファイルネーム指定ということでサイズ=0
  7426.     add.l    #4,d1
  7427.     move.l    tpt_addr(a5),a1
  7428.     add.l    d5,a1
  7429.     rept    4
  7430.     rol.l    #8,d1
  7431.     move.b    d1,(a1)+        *set jump addr.
  7432.     endm
  7433. 1:
  7434.     rts
  7435.  
  7436. get_str_zmd:            *文字列取得
  7437.     * > d1.l=得た文字列の長さ
  7438.     * - all
  7439. reglist    reg    d0/d2-d3
  7440.     movem.l    reglist,-(sp)
  7441.     move.l    tpt_now(a5),d3        *長さを検出するために使う
  7442.     bsr    skip_spc
  7443.     cmp.l    a4,d4
  7444.     bls    m_parameter_cannot_be_omitted
  7445.     move.b    (a4)+,d2        *end character
  7446.     cmpi.b    #"'",d2
  7447.     beq    1f
  7448.     cmpi.b    #'"',d2
  7449.     beq    1f
  7450.     moveq.l    #']',d2
  7451. 1:                    *get pattern name
  7452.     cmp.l    a4,d4
  7453.     bls    3f
  7454.     move.b    (a4)+,d0
  7455.     bsr    chk_kanji
  7456.     bpl    @f
  7457.     bsr    do_wrt_trk_b
  7458.     cmp.l    a4,d4
  7459.     bls    m_kanji_break_off    *漢字が途中で終わっている
  7460.     move.b    (a4)+,d0
  7461.     bsr    do_wrt_trk_b
  7462.     bra    1b
  7463. @@:
  7464.     cmpi.b    #' ',d0
  7465.     bcc    2f
  7466.     moveq.l    #' ',d0            *コントロールコードはスペースへ変換
  7467. 2:
  7468.     cmp.b    d2,d0
  7469.     beq    3f
  7470.     bsr    do_wrt_trk_b
  7471.     bra    1b
  7472. 3:
  7473.     moveq.l    #0,d0            *end code
  7474.     bsr    do_wrt_trk_b
  7475.     move.l    tpt_now(a5),d1
  7476.     sub.l    d3,d1            *d1.l=文字列長
  7477.     cmpi.b    #']',d2
  7478.     bne    @f
  7479.     subq.w    #1,a4            *']'が終端なら1つ戻って辻褄あわせ
  7480. @@:
  7481.     movem.l    (sp)+,reglist
  7482.     rts
  7483.  
  7484. mml_measure_jump:            *[JUMP]
  7485.     bset.b    #6,compile_status-work(a6)    *[JUMP]を使用したことをマーク
  7486.     bsr    chk_num
  7487.     bmi    m_parameter_cannot_be_omitted
  7488.     bsr    get_num
  7489.     moveq.l    #jump_ope3_zmd,d0
  7490.     bsr    do_wrt_trk_b
  7491.     move.l    d1,d0
  7492.     bra    do_wrt_trk_l
  7493.  
  7494. case_mml_bar:                *[---....]
  7495.     btst.b    #c_renp1,tpt_mode_flg(a5)    *連符内に小節線は使用出来ない
  7496.     bne    m_illegal_command_in_brace
  7497. @@:
  7498.     cmp.l    a4,d4
  7499.     bls    m_illegal_command_line
  7500.     move.b    (a4)+,d0
  7501.     cmpi.b    #'-',d0
  7502.     beq    @b
  7503.     cmpi.b    #']',d0
  7504.     bne    m_illegal_command_line
  7505.     moveq.l    #measure_zmd,d0
  7506.     bsr    do_wrt_trk_b
  7507.     bra    mml_lp
  7508.  
  7509. mml_measure:                *[MEASURE]/[BAR]
  7510.     btst.b    #c_renp1,tpt_mode_flg(a5)    *連符内に小節線は使用出来ない
  7511.     bne    m_illegal_command_in_brace
  7512. msrlp:
  7513.     cmp.l    a4,d4
  7514.     bls    m_illegal_command_line
  7515.     move.b    (a4)+,d0
  7516.     bsr    chk_kanji
  7517.     bpl    @f
  7518.     cmp.l    a4,d4
  7519.     bls    m_illegal_command_line
  7520.     addq.w    #1,a4
  7521.     bra    msrlp
  7522. @@:
  7523.     cmpi.b    #']',d0
  7524.     bne    msrlp
  7525.     subq.w    #1,a4            *']'に合わせる
  7526.     moveq.l    #measure_zmd,d0
  7527.     bra    do_wrt_trk_b
  7528.  
  7529. mml_rept_start:            *リピート関係の処理 |: or |n or |
  7530.     tst.b    ptn_cmd-work(a6)
  7531.     bne    m_illegal_command_in_pattern
  7532.     btst.b    #c_renp1,tpt_mode_flg(a5)    *連符内にrepeatコマンドは使用出来ない
  7533.     bne    m_illegal_command_in_brace
  7534.     bsr    skip_spc2
  7535.     cmp.l    a4,d4
  7536.     bls    m_disorderly_repeat_structure    *繰り返しコマンドの構造が異常
  7537.     cmpi.b    #':',(a4)
  7538.     bne    rept_skip    *|n case(リピート抜け出し処理へ)
  7539.                 *以下 |: ケース
  7540.     addq.w    #1,a4
  7541.     moveq.l    #2,d1        *count省略のケースは2回とみなす
  7542.     bsr    chk_num
  7543.     bmi    @f
  7544.     bsr    get_num
  7545. @@:
  7546.     subq.l    #1,d1
  7547.     cmpi.l    #rept_max-1,d1
  7548.     bhi    m_illegal_repeat_time
  7549.     bsr    push_rept_start            *mark repeat start address
  7550.     moveq.l    #repeat_start_zmd,d0        *repeat start cmd code
  7551.     bsr    do_wrt_trk_b
  7552.     move.l    d1,d0
  7553.     bsr    do_wrt_trk_w            *repeat count
  7554.     moveq.l    #0,d0
  7555.     bsr    do_wrt_trk_w            *repeat count work
  7556.     moveq.l    #0,d0                *initialize
  7557.     bsr    set_jmp_exit
  7558.     bra    mml_lp
  7559.  
  7560. rept_skip:            *ループを抜け出すコマンド |n or |
  7561.     bsr    chk_num            *数値なしならば最後のリピート時に抜け出すという
  7562.     bmi    rept_skip2        *別コマンドになる(| ケース)
  7563.     moveq.l    #repeat_skip_zmd,d0    *cmd code
  7564.     bsr    do_wrt_trk_b        *write cmd code
  7565.     bsr    get_num
  7566.     subq.l    #1,d1
  7567.     cmpi.l    #rept_max-1,d1
  7568.     bhi    m_illegal_repeat_time    *繰り返し番号が異常
  7569.     move.l    d1,d0            *destination repeat count
  7570.     bsr    do_wrt_trk_w
  7571. rptskp0:
  7572.     bsr    pop_rept_start2        *>d0 offset value to rept start cmd
  7573.     addq.l    #1,d0            *4(offset size)-3(rept cmdからcnt wkまでのoffset)=1
  7574.     bsr    do_wrt_trk_l        *offset address to rept count work
  7575.     move.l    tpt_now(a5),d0
  7576.     bsr    set_jmp_exit
  7577.     moveq.l    #0,d0            *dummy
  7578.     bsr    do_wrt_trk_l
  7579.     bsr    set_rept_cnt        *回数指定があることを報告
  7580.     bra    mml_lp
  7581.  
  7582. rept_skip2:
  7583.     moveq.l    #repeat_skip2_zmd,d0    *cmd code
  7584.     bsr    do_wrt_trk_b        *write cmd code
  7585.     bsr    pop_rept_start2        *>d0 offset value to rept start cmd
  7586.     addq.l    #1,d0            *4(offset size)-3(rept cmdからcnt wkまでのoffset)=1
  7587.     bsr    do_wrt_trk_l        *offset address to rept count work
  7588.     move.l    tpt_now(a5),d0
  7589.     bsr    set_jmp_exit
  7590.     moveq.l    #0,d0            *dummy
  7591.     bsr    do_wrt_trk_l
  7592. *    bsr    set_rept_cnt        *回数指定があることを報告
  7593.     bra    mml_lp
  7594.  
  7595. mml_rept_end:                *リピート終了コマンド
  7596.     tst.b    ptn_cmd-work(a6)
  7597.     bne    m_illegal_command_in_pattern
  7598.     cmp.l    a4,d4
  7599.     bls    m_syntax_error
  7600.     cmpi.b    #'|',(a4)        *本当に終了コマンド?
  7601.     bne    m_syntax_error
  7602.     addq.w    #1,a4            *skip '|'
  7603.     moveq.l    #repeat_end_zmd,d0    *set cmd code
  7604.     bsr    do_wrt_trk_b
  7605.     bsr    pop_rept_start        *>d0 offset value to rept start cmd
  7606.     addq.l    #3,d0            *4(offset size)-1(rept cmdからrept cntまでのoffset)=3
  7607.     bsr    do_wrt_trk_l
  7608.     bra    mml_lp
  7609.  
  7610. push_rept_start:            *リピートスタートアドレスのセット
  7611.     * < d1.l=repeat counter
  7612. reglist    reg    d0-d1/a2
  7613.     movem.l    reglist,-(sp)
  7614.     move.l    tpt_rept_max(a5),d0    *ここがゼロならばワークを確保しに行く
  7615.     bne    @f
  7616.     bsr    get_rept_work        *リピート処理ワーク確保
  7617. @@:
  7618.     move.l    tpt_rept_addr(a5),a2
  7619.     add.l    tpt_rept_n(a5),a2
  7620.     move.l    tpt_now(a5),(a2)+    *copmiled data addr.
  7621.     move.l    #$0000_0001,(a2)+    *clear flag.w:0 & set dummy repeat counter.w:1
  7622.     move.l    d1,(a2)+        *save repeat counter
  7623.     add.l    #rept_wksz,tpt_rept_n(a5)
  7624.     cmp.l    tpt_rept_n(a5),d0
  7625.     bhi    @f
  7626.     bsr    spread_rept_work    *リピート処理ワーク拡張
  7627. @@:
  7628.     movem.l    (sp)+,reglist
  7629.     rts
  7630.  
  7631. get_rept_work:                *リピート処理ワーク確保
  7632.     * > d0.l=tpt_rept_max
  7633. reglist    reg    d1-d3/a0-a1
  7634.     movem.l    reglist,-(sp)
  7635.     move.l    #rept_wksz*8,d2
  7636.     move.l    #ID_TEMP,d3
  7637.     bsr    get_mem
  7638.     tst.l    d0
  7639.     bmi    m_out_of_memory
  7640.     move.l    a0,tpt_rept_addr(a5)
  7641.     move.l    d2,tpt_rept_max(a5)    *work limit addr
  7642.     move.l    d2,d0
  7643.     clr.l    tpt_rept_n(a5)        *ptr
  7644.     movem.l    (sp)+,reglist
  7645.     rts
  7646.  
  7647. spread_rept_work:            *リピート処理ワーク拡張
  7648. reglist    reg    d0-d2/a0-a1
  7649.     movem.l    reglist,-(sp)
  7650.     move.l    tpt_rept_addr(a5),a1
  7651.     move.l    tpt_rept_max(a5),d2
  7652.     add.l    #rept_wksz*8,d2
  7653.     bsr    enlarge_mem
  7654.     tst.l    d0
  7655.     bmi    m_out_of_memory
  7656.     move.l    a0,tpt_rept_addr(a5)
  7657.     move.l    d2,tpt_rept_max(a5)    *work limit addr
  7658.     movem.l    (sp)+,reglist
  7659.     rts
  7660.  
  7661. pop_rept_start:        *リピートスタートアドレスまでのオフセット取りだし
  7662.     * > d0.l=repeat start offset address    (リピートスキップのオフセット処理も行う)
  7663. reglist    reg    a1-a2
  7664.     movem.l    reglist,-(sp)
  7665.     tst.l    tpt_rept_max(a5)
  7666.     beq    m_disorderly_repeat_structure    *ポップ不可
  7667.     move.l    tpt_rept_n(a5),d0
  7668.     beq    m_disorderly_repeat_structure    *ポップ不可
  7669.     sub.l    #rept_wksz,d0            *(sp--)相当
  7670.     move.l    tpt_rept_addr(a5),a2    *repeat work base addr.
  7671.     add.l    d0,a2
  7672.     move.l    r_rept_exit(a2),d0    *|n や |の未解決オフセット埋め込み処理が必要か
  7673.     beq    @f
  7674.     move.l    d0,a1            *a1=| or |nコマンドのジャンプオフセットが
  7675.     move.l    tpt_now(a5),d0        *書き込まれるべきアドレス
  7676.     sub.l    a1,d0
  7677.     add.l    tpt_addr(a5),a1
  7678.     rept    4
  7679.     rol.l    #8,d0
  7680.     move.b    d0,(a1)+        *set jump addr.
  7681.     endm
  7682.     clr.l    r_rept_exit(a2)        *オフセット書き込み終了
  7683. @@:
  7684.     move.l    tpt_now(a5),d0
  7685.     sub.l    r_rept_addr(a2),d0    *d0=repeat開始cmdまでのオフセットアドレス(戻り値)
  7686.     tst.w    r_rept_flag(a2)
  7687.     beq    @f
  7688.     subq.w    #1,r_rept_work(a2)    *dec repeat counter
  7689.     bcc    exit_prs
  7690. @@:
  7691.     sub.l    #rept_wksz,tpt_rept_n(a5)    *このリピート構造は完結
  7692. exit_prs:
  7693.     movem.l    (sp)+,reglist
  7694.     rts
  7695.  
  7696. pop_rept_start2:    *リピートスタートアドレスまでのオフセット取りだし(単なる取りだし)
  7697.     * > d0.l=repeat start offset address
  7698. reglist    reg    a1-a2
  7699.     movem.l    reglist,-(sp)
  7700.     tst.l    tpt_rept_max(a5)
  7701.     beq    m_disorderly_repeat_structure    *ポップ不可
  7702.     move.l    tpt_rept_n(a5),d0
  7703.     beq    m_disorderly_repeat_structure    *ポップ不可
  7704.     sub.l    #rept_wksz,d0            *(sp--)相当
  7705.     move.l    tpt_rept_addr(a5),a2    *repeat work base addr.
  7706.     add.l    d0,a2
  7707.     move.l    r_rept_exit(a2),d0    *|n や |の未解決オフセット埋め込み処理が必要か
  7708.     beq    @f
  7709.     move.l    d0,a1            *a1=| or |nコマンドのジャンプオフセットが
  7710.     move.l    tpt_now(a5),d0        *書き込まれるべきアドレス
  7711.     sub.l    a1,d0
  7712.     subq.l    #7,d0            *オフセットの値分引く
  7713.     add.l    tpt_addr(a5),a1
  7714.     rept    4
  7715.     rol.l    #8,d0
  7716.     move.b    d0,(a1)+        *set jump addr.
  7717.     endm
  7718.     clr.l    r_rept_exit(a2)        *オフセット書き込み終了
  7719. @@:
  7720.     move.l    tpt_now(a5),d0
  7721.     sub.l    r_rept_addr(a2),d0    *d0=repeat開始cmdまでのオフセットアドレス(戻り値)
  7722.     movem.l    (sp)+,reglist
  7723.     rts
  7724.  
  7725. set_rept_cnt:                    *リピートカウンタをセットする
  7726. reglist    reg    d0-d1/a2
  7727.     movem.l    reglist,-(sp)
  7728.     tst.l    tpt_rept_max(a5)
  7729.     beq    m_disorderly_repeat_structure    *ポップ不可
  7730.     move.l    tpt_rept_n(a5),d0
  7731.     beq    m_disorderly_repeat_structure    *ポップ不可
  7732.     sub.l    #rept_wksz,d0            *(sp--)相当
  7733.     move.l    tpt_rept_addr(a5),a2        *repeat work base addr.
  7734.     add.l    d0,a2
  7735.     move.w    r_rept_cnt(a2),d1
  7736.     tst.w    r_rept_flag(a2)            *すでにセット済みか
  7737.     bne    @f
  7738.     st.b    r_rept_flag(a2)            *セット終了マーク
  7739.     move.w    d1,r_rept_work(a2)        *回数値セット
  7740. @@:
  7741.     movem.l    (sp)+,reglist
  7742.     rts
  7743.  
  7744. set_jmp_exit:                    *リピート抜け出しオフセット
  7745.     * < d0=repeat exit offset address
  7746. reglist    reg    d0-d1/a2
  7747.     movem.l    reglist,-(sp)
  7748.     tst.l    tpt_rept_max(a5)
  7749.     beq    m_disorderly_repeat_structure    *ポップ不可
  7750.     move.l    tpt_rept_n(a5),d1
  7751.     beq    m_disorderly_repeat_structure    *ポップ不可
  7752.     sub.l    #rept_wksz,d1            *(sp--)相当
  7753.     move.l    tpt_rept_addr(a5),a2        *repeat work base addr.
  7754.     move.l    d0,r_rept_exit(a2,d1.l)
  7755.     movem.l    (sp)+,reglist
  7756.     rts
  7757.  
  7758. mml_q:                        *Qコマンド
  7759.     moveq.l    #0,d1
  7760.     move.b    gate_range-work(a6),d1
  7761.     bsr    chk_num
  7762.     bmi    set_q        *パラメータ省略時には最大ゲートが採択される(ex.Q8)
  7763.     bsr    get_num
  7764. set_q:
  7765.     bclr.b    #c_q_sgn,tpt_mode_flg(a5)
  7766.     tst.l    d1
  7767.     bpl    @f
  7768.     bset.b    #c_q_sgn,tpt_mode_flg(a5)
  7769.     neg.l    d1
  7770. @@:
  7771.     moveq.l    #0,d0
  7772.     move.b    gate_range-work(a6),d0
  7773.     cmp.l    d0,d1
  7774.     bhi    m_illegal_gate_time        *illegal q
  7775.     move.w    d1,tpt_gate_time(a5)
  7776.     bra    mml_lp
  7777.  
  7778. mml_o:                    *オクターブ
  7779.     bsr    chk_num
  7780.     bmi    m_parameter_cannot_be_omitted
  7781.     bsr    get_num            *d1=-1~9
  7782.     addq.l    #1,d1            *d1=0~10
  7783.     cmpi.l    #10,d1
  7784.     bhi    m_illegal_octave    *illegal octave
  7785.     move.b    d1,tpt_octave(a5)
  7786.     bra    mml_lp
  7787.  
  7788. oct_up:            *オクターブアップ(ここの仕様を変えたらPORTAMENTの部分のも変える)
  7789.     cmpi.b    #10,tpt_octave(a5)
  7790.     beq    m_illegal_octave    *illegal octave
  7791.     addq.b    #1,tpt_octave(a5)
  7792.     bra    mml_lp
  7793.  
  7794. oct_dwn:        *オクターブダウン
  7795.     tst.b    tpt_octave(a5)
  7796.     beq    m_illegal_octave    *illegal octave
  7797.     subq.b    #1,tpt_octave(a5)
  7798.     bra    mml_lp
  7799.  
  7800. mml_l:                    *Lコマンド
  7801.     btst.b    #c_renp1,tpt_mode_flg(a5)    *連符内にLコマンドは使用出来ない
  7802.     bne    m_illegal_command_in_brace
  7803.     bsr    skip_spc
  7804.     cmp.l    a4,d4
  7805.     bls    m_parameter_cannot_be_omitted    *音長が書かれていない
  7806.     cmpi.b    #'*',(a4)
  7807.     bne    @f        *音楽音長のケース
  7808.     addq.w    #1,a4        *skip '*'
  7809. get_@l:                *絶対音長
  7810.     bsr    chk_num
  7811.     bmi    m_parameter_cannot_be_omitted
  7812.     bsr    get_num
  7813.     move.l    d1,d0
  7814.     bra    consider_lftn
  7815. @@:
  7816.     bsr    chk_num
  7817.     bmi    m_parameter_cannot_be_omitted    *no L value
  7818.     bsr    get_length
  7819. consider_lftn:
  7820.     bsr    futen_ope            *<d0.l
  7821.     move.w    d1,tpt_note_len(a5)
  7822.     bra    mml_lp
  7823.  
  7824. mml_k:                *キートランスポーズ
  7825.     moveq.l    #0,d1
  7826.     bsr    chk_num
  7827.     bmi    @f
  7828.     bsr    get_num        *get tempo value
  7829. @@:
  7830.     move.l    d1,d0
  7831.     bpl    chk_k_abs
  7832.     neg.l    d0
  7833. chk_k_abs:            *絶対値で既定範囲内かをチェック
  7834.     cmpi.l    #127,d0
  7835.     bhi    m_key_transpose_out_of_range
  7836.     moveq.l    #key_transpose_zmd,d0
  7837.     bsr    do_wrt_trk_b
  7838.     move.l    d1,d0        *transpose value
  7839.     bsr    do_wrt_trk_b
  7840.     bra    mml_lp
  7841.  
  7842. mml_@tempo:                    *[@TEMPO]
  7843.     bsr    skip_spc
  7844.     cmp.l    a4,d4
  7845.     bls    m_parameter_cannot_be_omitted    *no T value
  7846.     move.b    (a4),d0
  7847.     cmpi.b    #'-',d0
  7848.     beq    mml_rltv_tm            *相対テンポ
  7849.     bsr    chk_num
  7850.     bpl    mml_rltv_tp            *相対テンポ
  7851.     bra    m_parameter_cannot_be_omitted    *no T value
  7852.  
  7853. mml_tempo:            *[TEMPO]
  7854. mml_t:                *テンポコマンド
  7855.     bsr    skip_spc
  7856.     cmp.l    a4,d4
  7857.     bls    m_parameter_cannot_be_omitted    *テンポ値が書かれていない
  7858.     move.b    (a4),d0
  7859.     cmpi.b    #'-',d0
  7860.     beq    mml_rltv_tm
  7861.     cmpi.b    #'+',d0
  7862.     beq    mml_rltv_tp
  7863.     bsr    chk_num
  7864.     bmi    m_parameter_cannot_be_omitted    *テンポ値の省略不可
  7865.     bsr    get_num
  7866.     tst.l    d1
  7867.     beq    m_illegal_tempo_value
  7868.     moveq.l    #tempo_t_zmd,d0
  7869.     bsr    do_wrt_trk_b    *write cmd
  7870.     move.l    d1,d0
  7871.     bsr    do_wrt_trk_w
  7872.     tst.b    seq_cmd-work(a6)
  7873.     beq    mml_lp
  7874.     rts
  7875. mml_rltv_tp:
  7876.     moveq.l    #1,d1
  7877.     bra    @f
  7878. mml_rltv_tm:
  7879.     moveq.l    #-1,d1
  7880. @@:
  7881.     move.l    a4,d0
  7882.     addq.w    #1,a4        *skip +,-
  7883.     bsr    chk_num        *パラメータ省略時は+1,-1となる
  7884.     bmi    @f
  7885.     move.l    d0,a4        *数値は符号から取得
  7886.     bsr    get_num
  7887. @@:
  7888.     moveq.l    #rltv_t_zmd,d0        *relative
  7889.     bsr    do_wrt_trk_b
  7890.     move.l    d1,d0
  7891.     bsr    do_wrt_trk_w
  7892.     tst.b    seq_cmd-work(a6)
  7893.     beq    mml_lp
  7894.     rts
  7895.  
  7896. mml_@n:                    *@N
  7897.     lea    v2_ch_tbl-work(a6),a1
  7898.     bra    @f
  7899. mml_n:                    *N
  7900.     lea    real_ch_tbl-work(a6),a1
  7901. @@:
  7902.     bsr    chk_num
  7903.     bmi    m_parameter_cannot_be_omitted    *no N value
  7904.     bsr    get_num
  7905.     subq.l    #1,d1
  7906.     cmpi.l    #31,d1
  7907.     bhi    m_illegal_channel
  7908.     lsl.w    #2,d1
  7909.     move.b    #asgn_chg_zmd,d0    *cmd
  7910.     bsr    do_wrt_trk_b
  7911.     move.l    (a1,d1.w),d0
  7912.     bsr    do_wrt_trk_l        *set type,ch value
  7913.     bra    mml_lp
  7914.  
  7915. mml_ch_assign:                *[CH_ASSIGN],[ASSIGN]
  7916.     bsr    get_str_ch        *>d2.l=type,ch
  7917.     bne    m_error_code_exit    *デバイス名異常
  7918.     move.b    #asgn_chg_zmd,d0    *cmd
  7919.     bsr    do_wrt_trk_b
  7920.     move.l    d2,d0
  7921.     bra    do_wrt_trk_l        *set type,ch value
  7922.  
  7923. mml_v:                        *ボリュームコマンド
  7924.     bsr    skip_spc
  7925.     cmp.l    a4,d4
  7926.     bls    m_parameter_cannot_be_omitted    *no @V value
  7927.     move.b    (a4),d0
  7928.     cmpi.b    #'+',d0
  7929.     beq    mml_rltv_vol_up2        *相対ボリューム
  7930.     cmpi.b    #'-',d0
  7931.     beq    mml_rltv_vol_dwn2        *相対ボリューム
  7932.     bsr    chk_num
  7933.     bmi    m_parameter_cannot_be_omitted
  7934.     bsr    get_num
  7935.     mulu    tpt_trkvol(a5),d1
  7936.     lsr.l    #7,d1                */128
  7937.     cmpi.l    #16,d1
  7938.     bhi    m_illegal_volume_value
  7939.     move.b    #volume_zmd,d0            *cmd code
  7940.     bsr    do_wrt_trk_b
  7941.     move.l    d1,d0
  7942.     tas.b    d0                *0-16range mode
  7943.     bsr    do_wrt_trk_b            *set v value
  7944.     bra    mml_lp
  7945.  
  7946. mml_rltv_vol_dwn2:            *相対ボリュームダウン2
  7947.     bsr    chk_num
  7948.     bmi    rltv_vd2_dflt
  7949.     bsr    get_num
  7950.     neg.l    d1
  7951.     cmp.l    #127,d1
  7952.     bhi    m_illegal_volume_value
  7953.     move.b    d1,tpt_rltv_vol(a5)
  7954.     bra    @f
  7955. rltv_vd2_dflt:
  7956.     moveq.l    #0,d1
  7957.     move.b    tpt_rltv_vol(a5),d1
  7958. @@:
  7959.     moveq.l    #rltv_vol2_zmd,d0
  7960.     bsr    do_wrt_trk_b
  7961.     move.l    d1,d0
  7962.     neg.b    d0
  7963.     bsr    do_wrt_trk_b
  7964.     bra    mml_lp
  7965.  
  7966. mml_rltv_vol_up2:            *相対ボリュームアップ2
  7967.     bsr    chk_num
  7968.     bmi    rltv_vu2_dflt
  7969.     bsr    get_num
  7970.     cmpi.l    #127,d1
  7971.     bhi    m_illegal_volume_value
  7972.     move.b    d1,tpt_rltv_vol(a5)
  7973.     bra    @f
  7974. rltv_vu2_dflt:
  7975.     moveq.l    #0,d1
  7976.     move.b    tpt_rltv_vol(a5),d1
  7977. @@:
  7978.     moveq.l    #rltv_vol2_zmd,d0
  7979.     bsr    do_wrt_trk_b
  7980.     move.l    d1,d0
  7981.     bsr    do_wrt_trk_b
  7982.     bra    mml_lp
  7983.  
  7984. mml_instrument_id:        *[INSTRUMENT_ID]
  7985. mml_@i:                *MIDI MODULE ID SET
  7986.     moveq.l    #127,d5
  7987.     bsr    chk_num
  7988.     bmi    m_parameter_cannot_be_omitted    *MAKER ID 省略できない
  7989.     bsr    get_num
  7990.     move.l    d1,d2
  7991.     cmp.l    d5,d2        *127より大きいとダメ
  7992.     bhi    m_illegal_maker_id
  7993.     bsr    skip_sep
  7994.  
  7995.     bsr    chk_num
  7996.     bmi    m_parameter_cannot_be_omitted    *DEVICE ID 省略できない
  7997.     bsr    get_num
  7998.     move.l    d1,d3
  7999.     cmp.l    d5,d3
  8000.     bhi    m_illegal_device_id
  8001.     bsr    skip_sep
  8002.  
  8003.     bsr    chk_num
  8004.     bmi    m_parameter_cannot_be_omitted    *MODEL ID 省略できない
  8005.     bsr    get_num
  8006.     cmp.l    d5,d1
  8007.     bhi    m_illegal_model_id
  8008.  
  8009.     moveq.l    #ID_set_zmd,d0
  8010.     bsr    do_wrt_trk_b
  8011.     bsr    wrt_data_d2
  8012.     bsr    wrt_data_d3
  8013.     bsr    wrt_data_d1
  8014.     tst.b    seq_cmd-work(a6)
  8015.     beq    mml_lp
  8016.     rts
  8017.  
  8018. mml_@velocity:                    *[@VELOCITY]
  8019.     bclr.b    #c_vseq,tpt_mode_flg(a5)    *velocity sequence stop
  8020.     bsr    chk_num
  8021.     bmi    m_parameter_cannot_be_omitted
  8022.     bsr    get_num
  8023.     move.l    d1,d0
  8024.     bpl    @f
  8025.     neg.l    d0
  8026. @@:                *絶対値にして変化量レンジ(-127~+127)を検査
  8027.     cmp.l    #127,d0
  8028.     bhi    m_illegal_velocity_value
  8029.     bra    go_wrt_rlvl
  8030.  
  8031. mml_velocity:            *[VELOCITY n]
  8032. mml_u:                *uコマンド
  8033.     bclr.b    #c_vseq,tpt_mode_flg(a5)    *velocity sequence stop
  8034.     bsr    skip_spc
  8035.     cmp.l    a4,d4
  8036.     bls    reset_velo
  8037.     move.b    (a4),d0
  8038.     moveq.l    #-1,d1        *数値省略の場合
  8039.     cmpi.b    #'-',d0
  8040.     beq    @f
  8041.     cmpi.b    #'+',d0
  8042.     bne    mml_last_@uN
  8043.     moveq.l    #1,d1        *数値省略の場合
  8044. @@:                *相対指定の場合
  8045.     move.l    a4,d0
  8046.     addq.w    #1,a4
  8047.     bsr    chk_num
  8048.     bmi    go_wrt_rlvl
  8049.     move.l    d0,a4
  8050.     bsr    get_num
  8051.     move.l    d1,d0
  8052.     bpl    @f
  8053.     neg.l    d0
  8054. @@:                *絶対値にして変化量レンジ(-127~+127)を検査
  8055.     cmp.l    #127,d0
  8056.     bhi    m_illegal_velocity_value
  8057. go_wrt_rlvl:
  8058.     moveq.l    #rltv_velo_zmd,d0
  8059.     bsr    do_wrt_trk_b
  8060.     bsr    wrt_data_d1
  8061.     tst.b    seq_cmd-work(a6)
  8062.     beq    mml_lp
  8063.     rts
  8064.  
  8065. reset_velo:
  8066.     moveq.l    #velocity_zmd,d0
  8067.     bsr    do_wrt_trk_b
  8068.     move.b    tpt_last_velo(a5),d0
  8069.     bsr    do_wrt_trk_b
  8070.     tst.b    seq_cmd-work(a6)
  8071.     beq    mml_lp
  8072.     rts
  8073.  
  8074. mml_@u:                *@uコマンド
  8075.     bclr.b    #c_vseq,tpt_mode_flg(a5)    *velocity sequence stop
  8076.     bsr    skip_spc
  8077.     cmp.l    a4,d4
  8078.     bls    rltv_u_dflt    *デフォルト相対
  8079.     move.b    (a4),d0
  8080.     cmpi.b    #'+',d0
  8081.     beq    relative_up
  8082.     cmpi.b    #'-',d0
  8083.     beq    relative_um
  8084. mml_@uN:
  8085.     bsr    chk_num
  8086.     bmi    rltv_u_dflt    *デフォルト相対
  8087.     bsr    get_num
  8088.     move.l    d1,d0
  8089.     bpl    @f
  8090.     neg.l    d0
  8091. @@:
  8092.     cmp.l    #127,d0        *計算結果がマイナスになってないか
  8093.     bhi    m_illegal_velocity_value
  8094. mml_@u_:            *< d1.b=velocity value
  8095.     move.b    d1,tpt_last_velo(a5)
  8096.     moveq.l    #velocity_zmd,d0
  8097.     bsr    do_wrt_trk_b
  8098.     bsr    wrt_data_d1
  8099.     tst.b    seq_cmd-work(a6)
  8100.     beq    mml_lp
  8101.     rts
  8102.  
  8103. rltv_u_dflt:            *@U/Uだけのとき
  8104.     move.b    tpt_rltv_velo(a5),d0
  8105.     bra    relative_u_
  8106. relative_um:
  8107.     moveq.l    #-1,d0
  8108.     bra    @f
  8109. relative_up:
  8110.     moveq.l    #1,d0
  8111. @@:
  8112.     move.l    a4,d1
  8113.     addq.w    #1,a4
  8114.     bsr    chk_num
  8115.     bmi    set_dfrlvu
  8116.     move.l    d1,a4
  8117.     bsr    get_num
  8118.     move.l    d1,d0
  8119.     bpl    @f
  8120.     neg.l    d1
  8121. @@:
  8122.     cmpi.l    #127,d1        *絶対値が127を越えてるか
  8123.     bhi    m_illegal_velocity_value
  8124. set_dfrlvu:
  8125.     move.b    d0,tpt_rltv_velo(a5)
  8126. relative_u_:
  8127.     move.b    tpt_last_velo(a5),d1
  8128.     add.b    d0,d1
  8129.     bpl    mml_@u_
  8130.     moveq.l    #0,d1
  8131.     tst.b    d0
  8132.     bmi    mml_@u_
  8133.     moveq.l    #127,d1
  8134.     bra    mml_@u_
  8135.  
  8136. mml_last_@uN:
  8137.     bsr    chk_num
  8138.     bpl    mml_@uN
  8139.     move.b    tpt_last_velo(a5),d1
  8140.     bra    mml_@u_
  8141.  
  8142. mml_exclusive:            *[EXCLUSIVE]
  8143.     bsr    skip_spc
  8144.     cmp.l    a4,d4
  8145.     bls    m_parameter_cannot_be_omitted
  8146.     cmpi.b    #'{',(a4)
  8147.     bne    @f
  8148.     addq.w    #1,a4
  8149. @@:
  8150.     moveq.l    #exclusive_zmd,d0    *send cmd code
  8151.     bsr    do_wrt_trk_b
  8152.     moveq.l    #-1,d0            *maker ID
  8153.     bsr    do_wrt_trk_b
  8154.     bra    mmlxentry
  8155.  
  8156. mml_yamaha_exclusive:        *[YAMAHA_EXCLUSIVE]
  8157.     bsr    skip_spc
  8158.     cmp.l    a4,d4
  8159.     bls    m_parameter_cannot_be_omitted
  8160.     cmpi.b    #'{',(a4)
  8161.     bne    @f
  8162.     addq.w    #1,a4
  8163. @@:
  8164.     moveq.l    #exclusive_zmd,d0    *send cmd code
  8165.     bsr    do_wrt_trk_b
  8166.     moveq.l    #MKID_YAMAHA,d0        *maker ID
  8167.     bsr    do_wrt_trk_b
  8168.     bra    mmlxentry
  8169.  
  8170. mml_roland_exclusive:            *[ROLAND_EXCLUSIVE]
  8171.     bsr    skip_spc
  8172.     cmp.l    a4,d4
  8173.     bls    m_parameter_cannot_be_omitted
  8174.     cmpi.b    #'{',(a4)
  8175.     bne    @f
  8176.     addq.w    #1,a4
  8177. @@:
  8178. mml_x:                    *ROLAND EXCLUSIVE DATA SEND
  8179.     moveq.l    #exclusive_zmd,d0    *send cmd code
  8180.     bsr    do_wrt_trk_b
  8181.     moveq.l    #MKID_ROLAND,d0        *MAKER ID
  8182.     bsr    do_wrt_trk_b
  8183. mmlxentry:
  8184.     moveq.l    #0,d0            *no comment
  8185.     bsr    do_wrt_trk_b        *comment length
  8186. go_get_mddt:
  8187.     move.l    tpt_now(a5),d5
  8188.     bsr    do_wrt_trk_l        *データ長サイズ分ダミーデータの書き込みでリザーブ
  8189.     moveq.l    #$7f,d2            *check over $7f
  8190.     bsr    wrt_send_data        *>d2.l=data length
  8191.     tst.l    d2
  8192.     beq    m_parameter_cannot_be_omitted    *値が一個もない時はエラー
  8193.     move.l    tpt_addr(a5),a1
  8194.     add.l    d5,a1
  8195. *    addq.l    #1,d2            *check sum分
  8196.     rept    4
  8197.     rol.l    #8,d2
  8198.     move.b    d2,(a1)+        *サイズ書き込み
  8199.     endm
  8200. *    moveq.l    #$80,d0
  8201. *    andi.b    #$7f,d3
  8202. *    sub.b    d3,d0            *d0=Roland check sum value
  8203. *    andi.b    #$7f,d0
  8204. *    bsr    do_wrt_trk_b
  8205.     tst.b    seq_cmd-work(a6)
  8206.     beq    mml_lp
  8207.     bsr    skip_spc
  8208.     cmp.l    a4,d4
  8209.     bls    m_illegal_command_line
  8210.     cmpi.b    #'}',(a4)
  8211.     bne    @f
  8212.     addq.w    #1,a4
  8213. @@:
  8214.     rts
  8215.  
  8216. wrt_send_data:            *転送データをバッファへ
  8217.     * < d2.l=0 data max range(127 or 255)
  8218.     * > d2.l=data総数
  8219.     * > d3.b=sum
  8220.     * X d0-d1,d3,a2
  8221. reglist    reg    d0-d1/d5/a2
  8222.     movem.l    reglist,-(sp)
  8223.     move.l    d2,d5        *limiter
  8224.     moveq.l    #0,d2        *init data length
  8225.     moveq.l    #0,d3        *init sum
  8226. mmlx_lp00:
  8227.     bsr    skip_sep
  8228.     bsr    skip_spc
  8229.     cmp.l    a4,d4
  8230.     bls    m_parameter_break_off
  8231.     tst.b    seq_cmd-work(a6)
  8232.     beq    1f        *MMLでは文字列は無し
  8233.     cmpi.b    #'"',(a4)
  8234.     bne    @f
  8235.     bsr    set_str_to_trk
  8236.     bra    mmlx_lp00
  8237. @@:
  8238.     cmpi.b    #"'",(a4)
  8239.     bne    1f
  8240.     bsr    set_str_to_trk
  8241.     bra    mmlx_lp00
  8242. 1:
  8243.     bsr    chk_num
  8244.     bmi    exit_mmlx_lp
  8245.     bsr    get_num
  8246.     bsr    mmlx_do_wrt_trk_b
  8247.     bra    mmlx_lp00
  8248. exit_mmlx_lp:
  8249.     movem.l    (sp)+,reglist
  8250.     rts
  8251.  
  8252. set_str_to_trk:                *文字列をソースより摘出してZMD化
  8253.     * < d1.l=data
  8254.     * < d2.l=data length
  8255.     * < d3.b=sum
  8256.     * > d2.l=data length
  8257.     * > d3.b=sum
  8258.     * - all                *(必ず"で囲まれている)
  8259. reglist    reg    d0/d5
  8260.     movem.l    reglist,-(sp)
  8261.     cmp.l    a4,d4
  8262.     bls    m_parameter_cannot_be_omitted
  8263.     cmpi.b    #'"',(a4)
  8264.     beq    @f
  8265.     cmpi.b    #"'",(a4)
  8266.     bne    m_string_break_off
  8267. @@:
  8268.     move.b    (a4)+,d5        *文字列終端記号
  8269.     moveq.l    #0,d0
  8270. msttlp00:
  8271.     cmp.l    a4,d4
  8272.     bls    exit_msttlp00
  8273.     move.b    (a4)+,d0
  8274.     move.l    d0,d1
  8275.     bsr    chk_kanji
  8276.     bpl    @f
  8277.     bsr    mmlx_do_wrt_trk_b
  8278.     cmp.l    a4,d4
  8279.     bls    m_kanji_break_off    *漢字が途中で終わっている
  8280.     move.b    (a4)+,d1
  8281.     bsr    mmlx_do_wrt_trk_b
  8282.     bra    msttlp00
  8283. @@:
  8284.     cmp.b    d5,d1
  8285.     beq    exit_msttlp00
  8286.     cmpi.b    #$0d,d1            *$0dは無視
  8287.     beq    msttlp00
  8288.     cmpi.b    #$0a,d1
  8289.     beq    @f
  8290.     bsr    mmlx_do_wrt_trk_b
  8291.     bra    msttlp00
  8292. @@:
  8293.     bsr    cr_line
  8294.     moveq.l    #$0d,d1
  8295.     bsr    mmlx_do_wrt_trk_b
  8296.     moveq.l    #$0a,d1
  8297.     bsr    mmlx_do_wrt_trk_b
  8298.     tst.b    d1
  8299.     bne    msttlp00
  8300. exit_msttlp00:
  8301.     movem.l    (sp)+,reglist
  8302.     rts
  8303.  
  8304. mmlx_do_wrt_trk_b:
  8305.     * < d1.l=data
  8306.     * < d2.l=data count
  8307.     * < d3.l=sum
  8308.     * < d5.l=limiter
  8309.     * > d2.l=data count
  8310.     * > d3.l=sum
  8311.     cmp.l    d5,d1
  8312.     bls    @f        *値がd2以下ならそのまま転送
  8313. 1:                *値がd2以上の時の処理
  8314.     move.b    d1,d0
  8315.     andi.b    #$7f,d0        *127以下へ
  8316.     add.b    d0,d3        *calc total
  8317.     bsr    do_wrt_trk_b
  8318.     addq.l    #1,d2
  8319.     lsr.l    #7,d1
  8320.     bne    1b
  8321.     rts
  8322. @@:
  8323.     move.b    d1,d0
  8324.     add.b    d0,d3        *calc total
  8325.     bsr    do_wrt_trk_b
  8326.     addq.l    #1,d2
  8327.     rts
  8328. *-----------------------------------------------------------------------------
  8329. *check_relation_cmn:            *コマンド関係チェック
  8330. *    tst.b    pattern_cmd-work(a6)    *MIDIパターン定義中か
  8331. *    bne    m_inappropriate_command    *無関係のコマンドを使用している
  8332. *    rts
  8333.  
  8334. *-----------------------------------------------------------------------------
  8335. do_wrt_zmd_w:            *共通コマンドエリアにword書き込み(ZMD作成時)
  8336.     * < d0.w=data
  8337.     rol.w    #8,d0
  8338.     move.b    d0,(a0)+
  8339.     bsr    chk_membdr_cmn
  8340.     rol.w    #8,d0
  8341. do_wrt_zmd_b:            *共通コマンドエリアにbyte書き込み(ZMD作成時)
  8342.     move.b    d0,(a0)+
  8343.     bra    chk_membdr_cmn
  8344.  
  8345. do_wrt_cmn_l:            *共通コマンドエリアにlong word書き込み(共通コマンド時)
  8346.     * < d0.l=data
  8347.     rol.l    #8,d0
  8348.     bsr    do_wrt_cmn_b
  8349.  
  8350.     rol.l    #8,d0
  8351.     bsr    do_wrt_cmn_b
  8352.  
  8353.     rol.l    #8,d0
  8354.     bsr    do_wrt_cmn_b
  8355.  
  8356.     rol.l    #8,d0
  8357.     bra    do_wrt_cmn_b
  8358.  
  8359. do_wrt_cmn_w:            *共通コマンドエリアにword書き込み(共通コマンド時)
  8360.     rol.w    #8,d0
  8361.     bsr    do_wrt_cmn_b
  8362.  
  8363.     rol.w    #8,d0
  8364. do_wrt_cmn_b:            *共通コマンドエリアにbyte書き込み(共通コマンド時)
  8365.     move.l    zmd_now-work(a6),a0
  8366.     addq.l    #1,zmd_now-work(a6)
  8367.     add.l    zmd_addr-work(a6),a0
  8368.     move.b    d0,(a0)+
  8369. chk_membdr_cmn:            *メモリ境界チェック(共通コマンド時)
  8370. chk_membdr_zmd:            *メモリ境界チェック(ZMD作成時)
  8371.     * < a0.l
  8372.     * - all
  8373.     cmp.l    zmd_end(pc),a0
  8374.     bcs    exit_cmz    *no error
  8375.     movem.l    d0/d2-d3/a1,-(sp)
  8376.     move.l    zmd_addr(pc),a1
  8377.     suba.l    a1,a0
  8378.     move.l    a0,d3
  8379.     move.l    zmd_size(pc),d2
  8380.     add.l    #10240,d2
  8381.     bsr    enlarge_mem
  8382.     tst.l    d0
  8383.     bmi    m_out_of_memory
  8384.     move.l    d2,zmd_size-work(a6)
  8385.     move.l    a0,zmd_addr-work(a6)
  8386.     add.l    a0,d2
  8387.     move.l    d2,zmd_end-work(a6)
  8388.     add.l    d3,a0
  8389.     movem.l    (sp)+,d0/d2-d3/a1
  8390. exit_cmz:
  8391.     rts
  8392.  
  8393. fix_zmd_size:            *ZMDサイズ確定(コンパイル最終処理段階)
  8394.     * < a0.l=最終アドレス
  8395.     * - all
  8396.     movem.l    d0/d2-d3/a1,-(sp)
  8397.     move.l    zmd_addr(pc),a1
  8398.     suba.l    a1,a0
  8399.     move.l    a0,d3
  8400.     move.l    d3,d2        *d2=確定サイズ
  8401.     bsr    enlarge_mem
  8402.     tst.l    d0
  8403.     bmi    m_out_of_memory
  8404.     move.l    d2,zmd_size-work(a6)
  8405.     move.l    a0,zmd_addr-work(a6)
  8406.     add.l    a0,d2
  8407.     move.l    d2,zmd_end-work(a6)
  8408.     add.l    d3,a0
  8409.     movem.l    (sp)+,d0/d2-d3/a1
  8410.     rts
  8411. *-----------------------------------------------------------------------------
  8412. do_wrt_ctrl_l:            *制御コマンドエリアにword書き込み
  8413.     * < d0.l=data
  8414.     rol.l    #8,d0
  8415.     bsr    do_wrt_ctrl_b
  8416.  
  8417.     rol.l    #8,d0
  8418.     bsr    do_wrt_ctrl_b
  8419.  
  8420.     rol.l    #8,d0
  8421.     bsr    do_wrt_ctrl_b
  8422.  
  8423.     rol.l    #8,d0
  8424.     bra    do_wrt_ctrl_b
  8425.  
  8426. do_wrt_ctrl_w:            *制御コマンドエリアにword書き込み
  8427.     * < d0.w=data
  8428.     rol.w    #8,d0
  8429.     bsr    do_wrt_ctrl_b
  8430.     rol.w    #8,d0
  8431.  
  8432. do_wrt_ctrl_b:            *制御コマンド関連コード書き込み
  8433.     * < d0.b=data
  8434.     * - all
  8435.     * x d0
  8436. reglist    reg    d2/a0-a1
  8437.     movem.l    reglist,-(sp)
  8438.     move.l    ctrl_now(pc),a1
  8439.     add.l    ctrl_addr(pc),a1
  8440.     move.b    d0,(a1)+
  8441.     cmp.l    ctrl_end(pc),a1
  8442.     bcs    @f            *no error
  8443.     move.l    ctrl_addr(pc),a1
  8444.     move.l    ctrl_size(pc),d2
  8445.     add.l    #2048,d2        *new size
  8446.     bsr    enlarge_mem
  8447.     tst.l    d0
  8448.     bmi    m_out_of_memory
  8449.     move.l    d2,ctrl_size-work(a6)
  8450.     move.l    a0,ctrl_addr-work(a6)
  8451.     add.l    a0,d2
  8452.     move.l    d2,ctrl_end-work(a6)
  8453. @@:
  8454.     addq.l    #1,ctrl_now-work(a6)
  8455.     movem.l    (sp)+,reglist
  8456.     rts
  8457. *-----------------------------------------------------------------------------
  8458. set_tit_w:
  8459.     ror.w    #8,d0
  8460.     bsr    set_tit
  8461.     ror.w    #8,d0
  8462.     bra    set_tit
  8463.  
  8464. set_tit_l:
  8465.     rol.l    #8,d0
  8466.     bsr    set_tit
  8467.     rol.l    #8,d0
  8468.     bsr    set_tit
  8469.     rol.l    #8,d0
  8470.     bsr    set_tit
  8471.     rol.l    #8,d0
  8472. set_tit:                *トラック情報テーブルへの情報一時セット
  8473.     * < d0.b=data
  8474.     * - all
  8475. reglist    reg    d0/d2/a0-a1
  8476.     movem.l    reglist,-(sp)
  8477.     move.l    trk_inf_tbl(pc),a1
  8478.     move.l    tit_now(pc),d2
  8479.     move.b    d0,(a1,d2.l)
  8480.     addq.l    #1,d2
  8481.     move.l    d2,tit_now-work(a6)
  8482.     cmp.l    tit_size(pc),d2
  8483.     bcs    @f            *no error
  8484.     add.l    #2048,d2        *new size
  8485.     bsr    enlarge_mem
  8486.     tst.l    d0
  8487.     bmi    m_out_of_memory
  8488.     move.l    d2,tit_size-work(a6)
  8489.     move.l    a0,trk_inf_tbl-work(a6)
  8490. @@:
  8491.     movem.l    (sp)+,reglist
  8492.     rts
  8493. *-----------------------------------------------------------------------------
  8494. set_current_trk:                *書き込みトラックのカレントを設定する
  8495.     * < d1.l=trk number(0-n)
  8496. reglist    reg    d0/a0
  8497.     movem.l    reglist,-(sp)
  8498.     move.w    n_of_track(pc),d0
  8499.     subq.w    #1,d0
  8500.     bcs    m_undefined_track_referred    *未定義のトラックを参照した
  8501.     move.l    trk_ptr_tbl(pc),a0
  8502. @@:
  8503.     cmp.l    (a0),d1
  8504.     beq    @f
  8505.     lea    tpt_tsize(a0),a0
  8506.     dbra    d0,@b
  8507.     bra    m_undefined_track_referred    *未定義のトラックを参照した
  8508. @@:
  8509.     move.l    a0,current_trk_ptr-work(a6)
  8510.     movem.l    (sp)+,reglist
  8511.     rts
  8512.  
  8513. get_trk_addr:                    *指定トラックのアドレスを得る
  8514.     * < d1.l=trk number(0-n)
  8515.     * > a2.l=addr
  8516. reglist    reg    d0/a0
  8517.     movem.l    reglist,-(sp)
  8518.     move.w    n_of_track(pc),d0
  8519.     subq.w    #1,d0
  8520.     bcs    m_undefined_track_referred    *未定義のトラックを参照した
  8521.     move.l    trk_ptr_tbl(pc),a0
  8522. @@:
  8523.     cmp.l    (a0),d1
  8524.     beq    @f
  8525.     lea    tpt_tsize(a0),a0
  8526.     dbra    d0,@b
  8527.     bra    m_undefined_track_referred    *未定義のトラックを参照した
  8528. @@:
  8529.     move.l    a0,a2
  8530.     movem.l    (sp)+,reglist
  8531.     rts
  8532.  
  8533. wrt_data_d1:
  8534.     move.l    d1,d0
  8535.     bra    do_wrt_trk_b
  8536. wrt_data_d2:
  8537.     move.l    d2,d0
  8538.     bra    do_wrt_trk_b
  8539. wrt_data_d3:
  8540.     move.l    d3,d0
  8541.     bra    do_wrt_trk_b
  8542.  
  8543. do_wrt_trk_v:                *可変長データの場合
  8544.     move.w    d0,-(sp)
  8545.     cmpi.w    #127,d0
  8546.     bhi    @f
  8547.     bsr    do_wrt_trk_b
  8548.     bra    1f
  8549. @@:
  8550.     ori.w    #$8000,d0
  8551.     bsr    do_wrt_trk_w
  8552. 1:
  8553.     move.w    (sp)+,d0
  8554.     rts
  8555.  
  8556. do_wrt_trk_w:                *カレント・トラックバッファへの書き込み
  8557.     rol.w    #8,d0
  8558.     bsr    do_wrt_trk_b
  8559.     rol.w    #8,d0
  8560.     bra    do_wrt_trk_b
  8561.  
  8562. do_wrt_trk_l:                *カレント・トラックバッファへの書き込み
  8563.     rol.l    #8,d0
  8564.     bsr    do_wrt_trk_b
  8565.     rol.l    #8,d0
  8566.     bsr    do_wrt_trk_b
  8567.     rol.l    #8,d0
  8568.     bsr    do_wrt_trk_b
  8569.     rol.l    #8,d0
  8570. do_wrt_trk_b:                *カレント・トラックバッファへの書き込み
  8571.     * < d0.b=data
  8572.     * - all
  8573. reglist    reg    d0/d2/a0-a1
  8574.     btst.b    #c_renp1,tpt_mode_flg(a5)
  8575.     bne    exit_dwtb
  8576.     movem.l    reglist,-(sp)
  8577.     move.l    tpt_addr(a5),a1        *addr
  8578.     move.l    tpt_now(a5),d2        *offset
  8579.     move.b    d0,(a1,d2.l)
  8580.     addq.l    #1,d2
  8581.     move.l    d2,tpt_now(a5)
  8582.     cmp.l    tpt_size(a5),d2        *size
  8583.     bcs    @f            *no error
  8584.     add.l    #10240,d2        *new size
  8585.     bsr    enlarge_mem
  8586.     tst.l    d0
  8587.     bmi    m_out_of_memory
  8588.     move.l    a0,tpt_addr(a5)
  8589.     move.l    d2,tpt_size(a5)
  8590. @@:
  8591.     movem.l    (sp)+,reglist
  8592. exit_dwtb:
  8593.     rts
  8594.  
  8595. secure_trk_bf:                *トラックバッファの最大長を拡張する
  8596.     * < d2.l=あと何バイト必要か
  8597.     * - all
  8598. reglist    reg    d2/a0-a1
  8599.     movem.l    reglist,-(sp)
  8600.     move.l    current_trk_ptr(pc),a0
  8601.     move.l    tpt_addr(a0),a1
  8602.     add.l    tpt_now(a0),d2
  8603.     cmp.l    tpt_size(a0),d2
  8604.     bcs    @f            *no error
  8605.     bsr    enlarge_mem
  8606.     tst.l    d0
  8607.     bmi    m_out_of_memory
  8608.     move.l    current_trk_ptr(pc),a1
  8609.     move.l    a0,tpt_addr(a1)
  8610.     move.l    d2,tpt_size(a1)
  8611. @@:
  8612.     movem.l    (sp)+,reglist
  8613.     rts
  8614.     .include    zcerror.has
  8615.  
  8616. cmd_@:                *@コマンド系
  8617.     bsr    skip_spc2
  8618.     bsr    chk_num
  8619.     bpl    mml_timbre    *数字が後ろにあるなら音色切り換えへ
  8620.     moveq.l    #0,d0
  8621.     move.b    (a4)+,d0
  8622.     bsr    mk_capital    *d0がalphabetなら大文字にして
  8623.     subi.b    #$41,d0        *'A'を引いて
  8624.     bmi    m_syntax_error
  8625.     cmpi.b    #25,d0
  8626.     bhi    m_syntax_error
  8627.     add.w    d0,d0
  8628.     move.w    mml_cmd_@_jmp(pc,d0.w),d0
  8629.     jmp    mml_cmd_@_jmp(pc,d0.w)
  8630.  
  8631. mml_cmd_@_jmp:
  8632.     dc.w    mml_@a-mml_cmd_@_jmp        *@A ARCC
  8633.     dc.w    mml_@b-mml_cmd_@_jmp        *@B detune
  8634.     dc.w    mml_@c-mml_cmd_@_jmp        *@C ARCC cnf
  8635.     dc.w    mml_@d-mml_cmd_@_jmp        *@D dumper
  8636.     dc.w    mml_@e-mml_cmd_@_jmp        *@E effect control
  8637.     dc.w    mml_@f-mml_cmd_@_jmp        *@F FRQ change
  8638.     dc.w    mml_@g-mml_cmd_@_jmp        *@G bend range change
  8639.     dc.w    mml_@h-mml_cmd_@_jmp        *@H modulation delay
  8640.     dc.w    mml_@i-mml_cmd_@_jmp        *@I ID SET
  8641.     dc.w    mml_@j-mml_cmd_@_jmp        *@J special tie mode
  8642.     dc.w    mml_@k-mml_cmd_@_jmp        *@K detune
  8643.     dc.w    mml_@l-mml_cmd_@_jmp        *@L length
  8644.     dc.w    mml_@m-mml_cmd_@_jmp        *@M pitch modulation
  8645.     dc.w    mml_@n-mml_cmd_@_jmp        *@N assign change
  8646.     dc.w    mml_@o-mml_cmd_@_jmp        *@O OPM noise
  8647.     dc.w    mml_@p-mml_cmd_@_jmp        *@P midi pan
  8648.     dc.w    mml_@q-mml_cmd_@_jmp        *@Q gate
  8649.     dc.w    mml_@r-mml_cmd_@_jmp        *@R non key off mode
  8650.     dc.w    mml_@s-mml_cmd_@_jmp        *@S modulation speed
  8651.     dc.w    mml_@t-mml_cmd_@_jmp        *@T timer value
  8652.     dc.w    mml_@u-mml_cmd_@_jmp        *@U velocity
  8653.     dc.w    mml_@v-mml_cmd_@_jmp        *@V volume
  8654.     dc.w    mml_@w-mml_cmd_@_jmp        *@W wait
  8655.     dc.w    mml_@x-mml_cmd_@_jmp        *@X MIDI data send
  8656.     dc.w    mml_@y-mml_cmd_@_jmp        *@Y NRPN
  8657.     dc.w    mml_@z-mml_cmd_@_jmp        *@Z after touch
  8658.  
  8659. mml_timbre:                *音色切り換え@
  8660.     bsr    set_bank_get_pgm_number    *>d1.l=timbre number
  8661.     move.b    #timbre_zmd,d0
  8662.     bra    @f
  8663.  
  8664. mml_timbre2:                *音色切り換え[TIMBRE]
  8665.     bsr    set_bank_get_pgm_number    *>d1.l=timbre number
  8666.     move.b    #timbre2_zmd,d0
  8667. @@:
  8668.     bsr    do_wrt_trk_b
  8669.     move.l    d1,d0
  8670.     bsr    do_wrt_trk_w        *set pgm number
  8671.     tst.b    seq_cmd-work(a6)
  8672.     beq    mml_lp
  8673.     rts
  8674.  
  8675. set_bank_get_pgm_number:
  8676.     * > d1.w=timbre number(0-????)
  8677.     * x d2
  8678.     bsr    chk_num
  8679.     bmi    m_parameter_cannot_be_omitted    *音色番号の省略はできない
  8680.     bsr    get_num                *get 1st number
  8681.  
  8682.     bsr    skip_spc
  8683.     cmp.l    a4,d4
  8684.     bls    2f
  8685.     move.b    (a4),d0
  8686.     cmpi.b    #':',d0
  8687.     beq    @f
  8688.     cmp.b    #',',d0
  8689.     bne    2f                *case:@n
  8690. @@:
  8691.     move.l    a4,d2                *保存
  8692.     addq.w    #1,a4
  8693.     bsr    skip_spc            *skip ,
  8694.     bsr    chk_num
  8695.     bmi    sbgpn00                *さっきの':'は別コマンドとみなす
  8696.     cmpi.l    #16383,d1
  8697.     bhi    m_illegal_bank_number
  8698.     move.l    d1,d2
  8699.     bsr    get_num                *get 2nd number
  8700.  
  8701.     bsr    skip_spc
  8702.     cmp.l    a4,d4
  8703.     bls    1f                *case:@b,n
  8704.     cmpi.b    #',',(a4)
  8705.     bne    1f
  8706.                         *case:@b1,b2,n
  8707.     cmpi.l    #127,d1
  8708.     bhi    m_illegal_bank_number
  8709.     cmpi.l    #127,d2
  8710.     bhi    m_illegal_bank_number
  8711.     moveq.l    #bank_select_zmd,d0        *バンクセレクトも書きだし
  8712.     bsr    do_wrt_trk_b
  8713.     move.l    d2,d0
  8714.     bsr    do_wrt_trk_b
  8715.     move.l    d1,d0
  8716.     bsr    do_wrt_trk_b
  8717.  
  8718.     bsr    skip_sep            *skip ,
  8719.     bsr    chk_num
  8720.     bmi    m_illegal_command_line
  8721.     bsr    get_num                *get 3rd number
  8722.     subq.l    #1,d1
  8723.     cmpi.l    #127,d1
  8724.     bhi    m_illegal_timbre_number        *illegal sound number
  8725.     rts
  8726. 1:                        *case:@b,n
  8727.     subq.l    #1,d1
  8728.     cmpi.l    #127,d1
  8729.     bhi    m_illegal_timbre_number        *illegal sound number
  8730.     moveq.l    #bank_select_zmd,d0
  8731.     bsr    do_wrt_trk_b
  8732.     move.l    d2,d0
  8733.     lsr.w    #7,d0
  8734.     bsr    do_wrt_trk_b
  8735.     move.l    d2,d0
  8736.     andi.b    #$7f,d0
  8737.     bra    do_wrt_trk_b
  8738. sbgpn00:
  8739.     move.l    d2,a4
  8740. 2:                        *@n(音色番号が1つしか指定されていない場合)
  8741.     subq.l    #1,d1
  8742.     cmp.l    #fmsnd_reg_max-1,d1
  8743.     bhi    m_illegal_timbre_number        *illegal sound number
  8744.     rts
  8745.  
  8746. mml_@pitch:                *[@PITCH]
  8747.     moveq.l    #rltv_@b_zmd,d2
  8748.     bra    @f
  8749. mml_pitch:                *[PITCH]
  8750.     moveq.l    #detune_@b_zmd,d2
  8751. @@:
  8752.     bsr    chk_num
  8753.     bmi    m_parameter_cannot_be_omitted
  8754.     bsr    get_num
  8755.     bsr    chk_k_ovf@b
  8756.     bmi    m_illegal_pitch_value
  8757.     move.l    d2,d0
  8758.     bsr    do_wrt_trk_b    *cmd
  8759.     move.l    d1,d0
  8760.     bra    do_wrt_trk_w
  8761.  
  8762. mml_@detune:                *[@DETUNE]
  8763.     moveq.l    #rltv_@k_zmd,d2
  8764.     bra    @f
  8765. mml_detune:                *[DETUNE]
  8766.     moveq.l    #detune_@k_zmd,d2
  8767. @@:
  8768.     bsr    chk_num
  8769.     bmi    m_parameter_cannot_be_omitted
  8770.     bsr    get_num
  8771.     bsr    chk_k_ovf@k
  8772.     bmi    m_illegal_pitch_value
  8773.     move.l    d2,d0
  8774.     bsr    do_wrt_trk_b    *cmd
  8775.     move.l    d1,d0
  8776.     bra    do_wrt_trk_w
  8777.  
  8778. mml_@k:
  8779.     move.l    #detune_@k_zmd*65536+bend_@k_zmd,d7
  8780.     lea    chk_k_ovf@k(pc),a2
  8781.     bra    get_@b_src
  8782.  
  8783. mml_bend:            *[BEND src,dst,delay,hold]
  8784.     bsr    chk_num
  8785.     bpl    mml_@b
  8786.     lea    switch_strv(pc),a1
  8787.     bsr    get_com_no
  8788.     bmi    m_illegal_switch_value    *規定外
  8789.     move.l    d0,d1
  8790.     bne    do_wrt_mbs        *ON指定だった場合はbend.switchと同じ扱いにする
  8791. mml_@b:                *@bコマンド
  8792.     move.l    #detune_@b_zmd*65536+bend_@b_zmd,d7
  8793.     lea    chk_k_ovf@b(pc),a2
  8794. get_@b_src:
  8795.     moveq.l    #0,d5        *d5=omt
  8796.     bsr    chk_num
  8797.     bmi    @f
  8798.     tas.b    d5        *set omt
  8799.     bsr    get_num
  8800.     jsr    (a2)        *chk over flow
  8801.     bmi    m_illegal_pitch_value
  8802.     move.l    d1,d2        *d2=src:-8192~8191
  8803. @@:
  8804.     bsr    skip_sep
  8805.     bsr    chk_num        *値が1個だけの時は
  8806.     bmi    @f
  8807.     ori.b    #$40,d5        *set omt
  8808.     bsr    get_num        *destination
  8809.     jsr    (a2)        *chk over flow
  8810.     bmi    m_illegal_pitch_value
  8811.     move.l    d1,d3        *d3=dest.
  8812. @@:                *get delay time
  8813.     bsr    skip_sep
  8814.     bsr    chk_num
  8815.     bmi    @f
  8816.     ori.w    #$20,d5        *set omt
  8817.     bsr    get_num
  8818.     cmpi.l    #-32768,d1
  8819.     blt    m_delay_too_long    *絶対値が16bit範囲より大きいとエラー
  8820.     cmpi.l    #32767,d1
  8821.     bgt    m_delay_too_long    *絶対値が16bit範囲より大きいとエラー
  8822.     move.l    d1,d6
  8823. @@:                *get hold time/port.time
  8824.     bsr    skip_sep
  8825.     bsr    chk_num
  8826.     bmi    do_wrt_bnd
  8827.     ori.w    #$10,d5        *set omt
  8828.     bsr    get_num
  8829.     move.l    d1,d0
  8830.     bpl    @f
  8831.     neg.l    d0
  8832.     cmpi.l    #max_note_len,d0
  8833.     bhi    m_hold_time_too_long
  8834.     bra    do_wrt_bnd
  8835. @@:
  8836.     cmpi.l    #max_note_len,d0
  8837.     bhi    m_bend_time_too_long
  8838. do_wrt_bnd:
  8839.     tst.b    d5
  8840.     beq    only_@b            *@bだけの場合
  8841.     cmpi.b    #$80,d5
  8842.     beq    case_set_dtn        *ディチューン設定ケース
  8843.     move.l    d7,d0
  8844.     bsr    do_wrt_trk_b
  8845.     move.b    d5,d0
  8846.     bsr    do_wrt_trk_b        *omt
  8847.     add.b    d5,d5
  8848.     bcc    @f
  8849.     move.w    d2,d0
  8850.     bsr    do_wrt_trk_w        *source bend value
  8851. @@:
  8852.     add.b    d5,d5
  8853.     bcc    @f
  8854.     move.w    d3,d0
  8855.     bsr    do_wrt_trk_w        *destination bend value
  8856. @@:
  8857.     add.b    d5,d5
  8858.     bcc    @f
  8859.     move.w    d6,d0
  8860.     bsr    consider_trkfrq_st    *trkfrqを考慮する
  8861.     bsr    do_wrt_trk_w        *delay time
  8862. @@:
  8863.     add.b    d5,d5
  8864.     bcc    exit_dwb
  8865.     move.w    d1,d0
  8866.     bpl    @f
  8867.     neg.w    d0
  8868.     bsr    consider_trkfrq_st    *trkfrqを考慮する
  8869.     neg.w    d0
  8870.     bsr    do_wrt_trk_w        *hold time
  8871.     bra    exit_dwb
  8872. @@:
  8873.     bsr    consider_trkfrq_st    *trkfrqを考慮する
  8874.     bsr    do_wrt_trk_w        *hold time
  8875. exit_dwb:
  8876.     tst.b    seq_cmd-work(a6)
  8877.     beq    mml_lp
  8878.     rts
  8879.  
  8880. only_@b:
  8881.     moveq.l    #bend_sw_zmd,d0
  8882.     bsr    do_wrt_trk_b
  8883.     moveq.l    #0,d0
  8884.     bsr    do_wrt_trk_b
  8885.     tst.b    seq_cmd-work(a6)
  8886.     beq    mml_lp
  8887.     rts
  8888.  
  8889. case_set_dtn:                *ディチューン設定ケース
  8890.     swap    d7
  8891.     move.l    d7,d0
  8892.     bsr    do_wrt_trk_b
  8893.     move.l    d2,d0
  8894.     bsr    do_wrt_trk_w
  8895.     tst.b    seq_cmd-work(a6)
  8896.     beq    mml_lp
  8897.     rts
  8898.  
  8899. chk_k_ovf@b:            *ディチューン値のover flowチェック
  8900.     * < d1.l=pitch
  8901.     cmp.l    #-8192,d1
  8902.     blt    @f
  8903.     cmp.l    #8191,d1
  8904.     ble    exit_k_ovf@b
  8905. @@:                *case:over flow
  8906.     move.w    #8,ccr        *minus
  8907.     rts
  8908. exit_k_ovf@k:
  8909. exit_k_ovf@b:
  8910.     move.w    #0,ccr        *plus
  8911.     rts
  8912.  
  8913. chk_k_ovf@k:            *デチューン値のover flowチェック
  8914.     * < d1.l=pitch
  8915.     cmp.l    #-7680,d1
  8916.     blt    @f
  8917.     cmp.l    #7680,d1
  8918.     ble    exit_k_ovf@k
  8919. @@:                *case:over flow
  8920.     move.w    #8,ccr        *minus
  8921.     rts
  8922.  
  8923. mml_bend_switch:                *[BEND.SWITCH]
  8924.     bsr    chk_num
  8925.     bpl    @f
  8926.     lea    switch_strv(pc),a1
  8927.     bsr    get_com_no
  8928.     bmi    m_illegal_switch_value    *規定外
  8929.     move.l    d0,d1
  8930.     bra    do_wrt_mbs
  8931. @@:
  8932.     bsr    get_num
  8933.     cmp.l    #1,d1
  8934.     bhi    m_illegal_switch_value    *規定外
  8935. do_wrt_mbs:
  8936.     moveq.l    #bend_sw_zmd,d0
  8937.     bsr    do_wrt_trk_b
  8938.     move.l    d1,d0            *mode value
  8939.     bra    do_wrt_trk_b
  8940.  
  8941. mml_auto_portament:            *[AUTO_PORTAMENT]
  8942.     moveq.l    #-1,d5            *sw=notouch
  8943.     bsr    chk_num
  8944.     bpl    @f
  8945.     lea    switch_strv(pc),a1
  8946.     bsr    get_com_no        *> OFF:0, ON:1
  8947.     bmi    @f            *規定外ならば無指定とみなす
  8948.     move.l    d0,d5
  8949. @@:
  8950.     bsr    skip_sep
  8951.     moveq.l    #0,d6            *omt
  8952.     bsr    chk_num
  8953.     bmi    @f
  8954.     bsr    get_num            *get delay time
  8955.     cmpi.l    #-32768,d1
  8956.     blt    m_delay_too_long    *絶対値が16bit範囲より大きいとエラー
  8957.     cmpi.l    #32767,d1
  8958.     bgt    m_delay_too_long    *絶対値が16bit範囲より大きいとエラー
  8959.     move.l    d1,d2
  8960.     moveq.l    #$80,d6
  8961. @@:
  8962.     bsr    skip_sep
  8963.     bsr    chk_num
  8964.     bmi    do_wrt_atport
  8965.     bsr    get_num            *get hold time
  8966.     move.l    d1,d0
  8967.     bpl    @f
  8968.     neg.l    d0
  8969.     cmpi.l    #max_note_len,d0
  8970.     bhi    m_hold_time_too_long
  8971.     bra    atprt00
  8972. @@:
  8973.     cmpi.l    #max_note_len,d0
  8974.     bhi    m_portament_time_too_long
  8975. atprt00:
  8976.     or.b    #$40,d6            *omt
  8977. do_wrt_atport:
  8978.     moveq.l    #auto_portament_zmd,d0
  8979.     bsr    do_wrt_trk_b
  8980.     move.l    d5,d0            *sw
  8981.     bsr    do_wrt_trk_b
  8982.     move.l    d6,d0            *omt
  8983.     bsr    do_wrt_trk_b
  8984.     tst.b    d6
  8985.     bpl    @f
  8986.     move.l    d2,d0            *delay
  8987.     bsr    consider_trkfrq_st    *trkfrqを考慮する
  8988.     bsr    do_wrt_trk_w
  8989. @@:
  8990.     add.b    d6,d6
  8991.     bpl    1f
  8992.     move.l    d1,d0            *hold
  8993.     bpl    @f
  8994.     neg.w    d0
  8995.     bsr    consider_trkfrq_st    *trkfrqを考慮する
  8996.     neg.w    d0
  8997.     bra    do_wrt_trk_w
  8998. @@:
  8999.     bsr    consider_trkfrq_st    *trkfrqを考慮する
  9000.     bra    do_wrt_trk_w
  9001. 1:
  9002.     rts
  9003.  
  9004. mml_auto_portament_switch:        *[AUTO_PORTAMENT.SWITCH]
  9005.     bsr    chk_num
  9006.     bpl    @f
  9007.     lea    switch_strv(pc),a1
  9008.     bsr    get_com_no        *> OFF:0, ON:1
  9009.     bmi    m_illegal_switch_value    *規定外
  9010.     move.l    d0,d1
  9011.     bra    do_wrt_mfp
  9012. @@:
  9013.     bsr    get_num
  9014.     cmp.l    #1,d1
  9015.     bhi    m_illegal_switch_value    *規定外
  9016. do_wrt_mfp:
  9017.     moveq.l    #auto_portament_zmd,d0
  9018.     bsr    do_wrt_trk_b
  9019.     move.l    d1,d0            *sw
  9020.     bsr    do_wrt_trk_b
  9021.     moveq.l    #0,d0            *omt=0
  9022.     bsr    do_wrt_trk_b
  9023.  
  9024. mml_echo:                *[ECHO]
  9025.     bsr    chk_num            *スイッチOFF、またはディレイタイムの取得
  9026.     bmi    @f
  9027.     bsr    get_length        *> d0.l=length
  9028.     move.w    d0,tpt_echo_dly(a5)
  9029.     beq    mech_sw_off
  9030.     st.b    tpt_echo_switch(a5)    *ON
  9031.     bra    get_mech_vdec
  9032. @@:
  9033.     cmp.l    a4,d4
  9034.     bls    m_parameter_cannot_be_omitted
  9035.     move.b    (a4),d0
  9036.     cmpi.b    #'*',d0
  9037.     bne    @f
  9038.     addq.w    #1,a4
  9039.     bsr    chk_num
  9040.     bmi    m_illegal_switch_value    *規定外
  9041.     bsr    get_num
  9042.     cmpi.l    #max_note_len,d1
  9043.     bhi    m_delay_too_long
  9044.     move.w    d1,tpt_echo_dly(a5)    *0ならばOFFにほかならない
  9045.     beq    mech_sw_off
  9046.     st.b    tpt_echo_switch(a5)    *ON
  9047.     bra    get_mech_vdec
  9048. @@:                    *文字列'OFF'か
  9049.     cmpi.b    #',',d0
  9050.     beq    get_mech_vdec
  9051.     lea    echo_strv(pc),a1
  9052.     bsr    get_com_no
  9053.     bmi    m_illegal_switch_value    *規定外
  9054. mech_sw_off:
  9055.     clr.b    tpt_echo_switch(a5)    *OFF
  9056. get_mech_vdec:                *減衰音量値
  9057.     bsr    skip_sep
  9058.     bsr    chk_num
  9059.     bmi    get_mech_loop
  9060.     bsr    get_num
  9061.     cmpi.l    #-128,d1
  9062.     blt    m_illegal_volume_value
  9063.     cmpi.l    #127,d1
  9064.     bgt    m_illegal_volume_value
  9065.     move.b    d1,tpt_echo_vdec(a5)
  9066. get_mech_loop:                *ループタイム
  9067.     bsr    skip_sep
  9068.     bsr    chk_num
  9069.     bmi    @f
  9070.     bsr    get_num
  9071.     cmpi.l    #65535,d1
  9072.     bhi    m_illegal_repeat_time
  9073.     move.w    d1,tpt_echo_loop(a5)
  9074.     rts
  9075. @@:                    *文字列'LOOP'か
  9076.     cmp.l    a4,d4
  9077.     bls    m_illegal_command_line
  9078.     cmp.b    #']',(a4)        *最後のパラメータが省略されているか
  9079.     beq    @f
  9080.     lea    mechlp_strv(pc),a1
  9081.     bsr    get_com_no
  9082.     bmi    m_illegal_switch_value
  9083.     move.w    d0,tpt_echo_loop(a5)
  9084. @@:
  9085.     rts
  9086.  
  9087. mml_effect_chorus:        *[EFFECT.CHORUS]
  9088.     bsr    chk_num
  9089.     bmi    m_parameter_cannot_be_omitted
  9090.     bsr    get_num
  9091.     cmp.l    #127,d1
  9092.     bhi    m_illegal_effect_parameter
  9093.     moveq.l    #effect_ctrl_zmd,d0        *cmd code
  9094.     bsr    do_wrt_trk_b
  9095.     moveq.l    #2,d0
  9096.     bsr    do_wrt_trk_b    *omt
  9097.     move.l    d1,d0
  9098.     bra    do_wrt_trk_b    *value
  9099.  
  9100. mml_effect_delay:        *[EFFECT.DELAY]
  9101.     bsr    chk_num
  9102.     bmi    m_parameter_cannot_be_omitted
  9103.     bsr    get_num
  9104.     cmp.l    #127,d1
  9105.     bhi    m_illegal_effect_parameter
  9106.     moveq.l    #effect_ctrl_zmd,d0        *cmd code
  9107.     bsr    do_wrt_trk_b
  9108.     moveq.l    #4,d0
  9109.     bsr    do_wrt_trk_b    *omt
  9110.     move.l    d1,d0
  9111.     bra    do_wrt_trk_b    *value
  9112.  
  9113. mml_effect_reverb:        *[EFFECT.REVERB]
  9114.     bsr    chk_num
  9115.     bmi    m_parameter_cannot_be_omitted
  9116.     bsr    get_num
  9117.     cmp.l    #127,d1
  9118.     bhi    m_illegal_effect_parameter
  9119.     moveq.l    #effect_ctrl_zmd,d0        *cmd code
  9120.     bsr    do_wrt_trk_b
  9121.     moveq.l    #1,d0
  9122.     bsr    do_wrt_trk_b    *omt
  9123.     move.l    d1,d0
  9124.     bra    do_wrt_trk_b    *value
  9125.  
  9126. mml_effect:            *[EFFECT]
  9127. mml_@e:                *@E エフェクトコントロール
  9128.     moveq.l    #1,d2
  9129.     moveq.l    #0,d5        *omt
  9130.     move.l    temp_buffer(pc),a1
  9131. @@:
  9132.     bsr    chk_num
  9133.     bmi    1f
  9134.     bsr    get_num
  9135.     cmp.l    #127,d1
  9136.     bhi    m_illegal_effect_parameter
  9137.     move.b    d1,(a1)+
  9138.     or.b    d2,d5
  9139. 1:
  9140.     bsr    skip_spc
  9141.     cmp.l    a4,d4
  9142.     bls    @f
  9143.     cmpi.b    #',',(a4)
  9144.     bne    @f
  9145.     bsr    skip_sep            *skip ','
  9146.     add.b    d2,d2
  9147.     bne    @b
  9148. @@:
  9149.     move.l    temp_buffer(pc),a1
  9150.     moveq.l    #effect_ctrl_zmd,d0        *cmd code
  9151.     bsr    do_wrt_trk_b
  9152.     move.l    d5,d0                *omt
  9153.     bsr    do_wrt_trk_b
  9154. mml@elp:
  9155.     lsr.b    #1,d5
  9156.     bcc    @f
  9157.     move.b    (a1)+,d0
  9158.     bsr    do_wrt_trk_b
  9159. @@:
  9160.     tst.b    d5
  9161.     bne    mml@elp
  9162.     tst.b    seq_cmd-work(a6)
  9163.     beq    mml_lp
  9164.     rts
  9165.  
  9166. mml_frequency:            *[FREQUENCY]
  9167. mml_@f:                *@F ADPCM周波数切り換え
  9168.     moveq.l    #4,d1        *default
  9169.     bsr    chk_num
  9170.     bmi    @f
  9171.     bsr    get_num
  9172.     cmpi.l    #6,d1
  9173.     bls    @f
  9174.     bsr    m_illegal_frequency_number
  9175. @@:
  9176.     moveq.l    #frq_chg_zmd,d0
  9177.     bsr    do_wrt_trk_b
  9178.     bsr    wrt_data_d1
  9179.     tst.b    seq_cmd-work(a6)
  9180.     beq    mml_lp
  9181.     rts
  9182.  
  9183. mml_ch_pressure:            *[CH_PRESSURE]
  9184.     bsr    skip_spc
  9185.     cmp.l    a4,d4
  9186.     bls    m_parameter_cannot_be_omitted
  9187.     cmpi.b    #'-',(a4)
  9188.     beq    rltv_ch_prs
  9189.     cmpi.b    #'+',(a4)
  9190.     beq    rltv_ch_prs
  9191.     bsr    chk_num
  9192.     bmi    m_parameter_cannot_be_omitted
  9193.     bsr    get_num
  9194.     cmpi.l    #127,d1
  9195.     bhi    m_illegal_velocity_value
  9196.     moveq.l    #ch_pressure_zmd,d0
  9197.     bsr    do_wrt_trk_b
  9198.     bra    wrt_data_d1
  9199.  
  9200. rltv_ch_prs:                *相対CH_PRESSURE
  9201.     bsr    get_num
  9202.     move.l    d1,d0
  9203.     bpl    @f
  9204.     neg.l    d0
  9205. @@:
  9206.     cmpi.l    #127,d0
  9207.     bhi    m_illegal_velocity_value
  9208.     moveq.l    #rltv_ch_pressure_zmd,d0
  9209.     bsr    do_wrt_trk_b
  9210.     bra    wrt_data_d1
  9211.  
  9212. mml_polyphonic_pressure:            *[POLYPHONIC_PRESSURE]
  9213.     move.b    tpt_octave(a5),oct_wk-work(a6)    *一時保存
  9214.     bsr    chk_num
  9215.     bmi    @f
  9216.     bsr    get_num                *数値によるノート指定
  9217.     move.l    d1,d2
  9218.     bra    chk_plyprsky
  9219. @@:                        *文字によるノート指定
  9220.     bsr    skip_spc
  9221.     cmp.l    a4,d4
  9222.     bls    m_illegal_command_line
  9223.     move.b    (a4),d0
  9224.     bsr    oct_chk                *オクターブがあれば取得
  9225.     bmi    @b
  9226.     bsr    get_port_key
  9227.     move.l    d0,d2
  9228. chk_plyprsky:
  9229.     cmpi.l    #127,d2
  9230.     bhi    m_illegal_note_number
  9231.     move.b    oct_wk(pc),tpt_octave(a5)    *復元
  9232.     bsr    skip_sep
  9233.     cmp.l    a4,d4
  9234.     bls    m_parameter_cannot_be_omitted
  9235.     cmpi.b    #'-',(a4)
  9236.     beq    @f
  9237.     cmpi.b    #'+',(a4)
  9238.     bne    get_prsvel
  9239. @@:
  9240.     tas.b    d2                *相対ケース
  9241. get_prsvel:
  9242.     bsr    chk_num
  9243.     bmi    m_parameter_cannot_be_omitted
  9244.     bsr    get_num
  9245.     move.l    d1,d0
  9246.     bpl    @f
  9247.     neg.l    d0
  9248. @@:
  9249.     cmpi.l    #127,d0
  9250.     bhi    m_illegal_velocity_value
  9251.     moveq.l    #polyphonic_pressure_zmd,d0
  9252.     bsr    do_wrt_trk_b        *cmd
  9253.     move.l    d2,d0
  9254.     bsr    do_wrt_trk_b        *note
  9255.     move.l    d1,d0
  9256.     bra    do_wrt_trk_b        *velocity
  9257.  
  9258. mml_@l:                    *@Lコマンド
  9259.     btst.b    #c_renp1,tpt_mode_flg(a5)    *連符内にLコマンドは使用出来ない
  9260.     bne    m_illegal_command_in_brace
  9261.     bra    get_@l
  9262.  
  9263. mml_timer:            *[TIMER]
  9264. mml_@t:                *@Tコマンド
  9265.     bsr    skip_spc
  9266.     cmp.l    a4,d4
  9267.     bls    m_parameter_cannot_be_omitted
  9268.     move.b    (a4),d0
  9269.     cmpi.b    #'-',d0
  9270.     beq    mml_rltv_@tm
  9271.     cmpi.b    #'+',d0
  9272.     beq    mml_rltv_@tp
  9273.     bsr    chk_num
  9274.     bmi    m_parameter_cannot_be_omitted    *no @T value
  9275.     bsr    get_num
  9276.     move.b    #tempo_@t_zmd,d0
  9277.     bsr    do_wrt_trk_b    *write cmd
  9278.     move.l    d1,d0
  9279.     bsr    do_wrt_trk_w    *timer value
  9280.     tst.b    seq_cmd-work(a6)
  9281.     beq    mml_lp
  9282.     rts
  9283.  
  9284. mml_rltv_@tm:
  9285.     moveq.l    #-1,d1
  9286.     bra    @f
  9287. mml_rltv_@tp:
  9288.     moveq.l    #1,d1
  9289. @@:
  9290.     move.l    a4,d0
  9291.     addq.w    #1,a4
  9292.     bsr    chk_num
  9293.     bmi    @f        *no @T value
  9294.     move.l    d0,a4
  9295.     bsr    get_num
  9296. @@:
  9297.     moveq.l    #rltv_@t_zmd,d0
  9298.     bsr    do_wrt_trk_b
  9299.     move.l    d1,d0
  9300.     bsr    do_wrt_trk_w
  9301.     tst.b    seq_cmd-work(a6)
  9302.     beq    mml_lp
  9303.     rts
  9304.  
  9305. mml_panpot:                *[PANPOT]
  9306.     bsr    chk_num
  9307.     bpl    mml_@p
  9308.     cmp.l    a4,d4
  9309.     bls    mml_@p
  9310.     move.b    (a4)+,d0        *Lnn,Rnnという表記に対応
  9311.     bsr    mk_capital
  9312.     bsr    chk_num
  9313.     bmi    @f
  9314.     bsr    get_num
  9315.     tst.l    d1            *パラメータは1~63まで
  9316.     beq    m_illegal_panpot_value
  9317.     cmpi.l    #63,d1
  9318.     bhi    m_illegal_panpot_value
  9319.     cmpi.b    #'L',d0
  9320.     bne    @f
  9321.     move.l    d1,d0
  9322.     moveq.l    #64,d1
  9323.     sub.b    d0,d1            *1-63
  9324.     bra    do_wrt_@p
  9325. @@:
  9326.     cmpi.b    #'R',d0
  9327.     bne    @f
  9328.     add.b    #64,d1            *65-127
  9329.     bra    do_wrt_@p
  9330. @@:
  9331.     cmpi.b    #'M',d0
  9332.     bne    m_illegal_panpot_value
  9333.     moveq.l    #64,d1            *64
  9334.     bra    do_wrt_@p
  9335.  
  9336. mml_@panpot:            *[@PANPOT]
  9337.     bsr    skip_spc
  9338.     cmp.l    a4,d4
  9339.     bls    m_parameter_cannot_be_omitted    *no value
  9340.     move.b    (a4),d0
  9341.     cmpi.b    #'-',d0
  9342.     beq    mml_rltv_@pm
  9343.     bsr    chk_num
  9344.     bpl    mml_rltv_@pp
  9345.     bra    m_parameter_cannot_be_omitted    *no value
  9346.  
  9347. mml_@p:                *@pコマンド
  9348.     bsr    skip_spc
  9349.     cmp.l    a4,d4
  9350.     bls    @f
  9351.     move.b    (a4),d0
  9352.     cmpi.b    #'+',d0
  9353.     beq    mml_rltv_@pp
  9354.     cmpi.b    #'-',d0
  9355.     beq    mml_rltv_@pm
  9356. @@:
  9357.     moveq.l    #64,d1
  9358.     bsr    chk_num
  9359.     bmi    do_wrt_@p
  9360.     bsr    get_num
  9361.     cmpi.l    #128,d1
  9362.     bhi    m_illegal_panpot_value
  9363. do_wrt_@p:
  9364.     moveq.l    #panpot_zmd,d0
  9365.     bsr    do_wrt_trk_b
  9366.     move.l    d1,d0
  9367.     bsr    do_wrt_trk_b
  9368.     tst.b    seq_cmd-work(a6)
  9369.     beq    mml_lp
  9370.     rts
  9371.  
  9372. mml_rltv_@pm:
  9373.     moveq.l    #-1,d1
  9374.     bra    @f
  9375. mml_rltv_@pp:
  9376.     moveq.l    #1,d1
  9377. @@:
  9378.     move.l    a4,d0
  9379.     addq.w    #1,a4
  9380.     bsr    chk_num
  9381.     bmi    wrtmml@p    *no @p value
  9382.     move.l    d0,a4
  9383.     bsr    get_num
  9384.     move.l    d1,d0
  9385.     bpl    @f
  9386.     neg.l    d0
  9387. @@:
  9388.     cmpi.l    #127,d0
  9389.     bhi    m_illegal_panpot_value
  9390. wrtmml@p:
  9391.     moveq.l    #rltv_pan_zmd,d0
  9392.     bsr    do_wrt_trk_b
  9393.     move.l    d1,d0
  9394.     bsr    do_wrt_trk_b
  9395.     tst.b    seq_cmd-work(a6)
  9396.     beq    mml_lp
  9397.     rts
  9398.  
  9399. mml_@q:                    *@qコマンド
  9400.     bsr    chk_num
  9401.     bmi    fixedgtsw
  9402.     bsr    get_num
  9403.     tst.l    d1
  9404.     bne    @f
  9405.     moveq.l    #0,d1            *0の場合はQ8と同じ
  9406.     move.b    gate_range(pc),d1
  9407.     bra    set_q
  9408. @@:
  9409.     bclr.b    #c_q_sgn,tpt_mode_flg(a5)
  9410.     tst.l    d1
  9411.     bpl    @f
  9412.     bset.b    #c_q_sgn,tpt_mode_flg(a5)
  9413.     neg.l    d1
  9414. @@:
  9415.     cmpi.l    #32767,d1
  9416.     bhi    m_illegal_gate_time        *illegal @Q
  9417.     neg.w    d1
  9418.     move.w    d1,tpt_gate_time(a5)
  9419. fixedgtsw:
  9420.     bsr    skip_sep            *skip ','
  9421.     bsr    chk_num
  9422.     bmi    mml_lp
  9423.     bsr    get_num
  9424.     tst.l    d1
  9425.     beq    @f
  9426.     bset.b    #c_@q,tpt_mode_flg(a5)        *@Q mode switch on (fixed gate time)
  9427.     bra    mml_lp
  9428. @@:
  9429.     bclr.b    #c_@q,tpt_mode_flg(a5)        *@Q mode switch off (normal @Q)
  9430.     bra    mml_lp
  9431.  
  9432. mml_voice_reserve:                *[VOICE_RESERVE]
  9433.     bsr    skip_spc
  9434.     cmp.l    a4,d4
  9435.     bls    m_parameter_cannot_be_omitted    *no value
  9436.     move.b    (a4),d0
  9437.     bsr    chk_num
  9438.     bmi    m_parameter_cannot_be_omitted    *no value
  9439.     bsr    get_num
  9440.     subq.l    #1,d1
  9441.     cmpi.l    #255,d1
  9442.     bhi    m_illegal_reservation        *illegal value
  9443.     moveq.l    #voice_reserve_zmd,d0
  9444.     bsr    do_wrt_trk_b
  9445.     move.l    d1,d0
  9446.     bra    do_wrt_trk_b
  9447.  
  9448. mml_@volume:                    *[@VOLUME n]
  9449.     bsr    skip_spc
  9450.     cmp.l    a4,d4
  9451.     bls    m_parameter_cannot_be_omitted    *no @V value
  9452.     move.b    (a4),d0
  9453.     cmpi.b    #'-',d0
  9454.     beq    rltv_@volume_dwn        *相対ボリューム
  9455.     cmpi.b    #'+',d0
  9456.     beq    rltv_@volume_up            *相対ボリューム
  9457.     bsr    chk_num
  9458.     bpl    rltv_@volume_up            *相対ボリューム
  9459.     bra    m_parameter_cannot_be_omitted    *no @V value
  9460.  
  9461. mml_volume:                    *[VOLUME n]
  9462. mml_@v:                        *@Vコマンド
  9463.     bsr    skip_spc
  9464.     cmp.l    a4,d4
  9465.     bls    m_parameter_cannot_be_omitted    *no @V value
  9466.     move.b    (a4),d0
  9467.     cmpi.b    #'+',d0
  9468.     beq    rltv_@volume_up            *相対ボリューム
  9469.     cmpi.b    #'-',d0
  9470.     beq    rltv_@volume_dwn            *相対ボリューム
  9471.     bsr    chk_num
  9472.     bmi    m_parameter_cannot_be_omitted    *no @V value
  9473.     bsr    get_num
  9474.     mulu    tpt_trkvol(a5),d1
  9475.     lsr.l    #7,d1                */128
  9476.     cmpi.l    #127,d1
  9477.     bhi    m_illegal_volume_value        *illegal @V
  9478.     moveq.l    #volume_zmd,d0
  9479.     bsr    do_wrt_trk_b
  9480.     move.l    d1,d0
  9481.     bsr    do_wrt_trk_b
  9482.     tst.b    seq_cmd-work(a6)
  9483.     beq    mml_lp
  9484.     rts
  9485.  
  9486. rltv_@volume_dwn:            *相対ボリュームダウン
  9487. @@:
  9488.     bsr    skip_spc
  9489.     cmp.l    a4,d4
  9490.     bls    m_parameter_cannot_be_omitted    *no @V value
  9491.     cmpi.b    #'-',(a4)
  9492.     bne    @f
  9493.     addq.w    #1,a4
  9494.     bra    @b
  9495. @@:
  9496.     bsr    chk_num
  9497.     bmi    1f
  9498.     bsr    get_num
  9499.     cmp.l    #127,d1
  9500.     bhi    m_illegal_volume_value
  9501.     move.b    d1,tpt_rltv_vol(a5)
  9502.     bra    @f
  9503. 1:
  9504.     moveq.l    #0,d1
  9505.     move.b    tpt_rltv_vol(a5),d1
  9506. @@:
  9507.     moveq.l    #rltv_vol_zmd,d0
  9508.     bsr    do_wrt_trk_b
  9509.     move.l    d1,d0
  9510.     neg.b    d0
  9511.     bsr    do_wrt_trk_b
  9512.     tst.b    seq_cmd-work(a6)
  9513.     beq    mml_lp
  9514.     rts
  9515.  
  9516. rltv_@volume_up:            *相対ボリュームアップ
  9517. @@:
  9518.     bsr    skip_spc
  9519.     cmp.l    a4,d4
  9520.     bls    m_parameter_cannot_be_omitted    *no @V value
  9521.     cmpi.b    #'+',(a4)
  9522.     bne    @f
  9523.     addq.w    #1,a4
  9524.     bra    @b
  9525. @@:
  9526.     bsr    chk_num
  9527.     bmi    1f
  9528.     bsr    get_num
  9529.     cmpi.l    #127,d1
  9530.     bhi    m_illegal_volume_value
  9531.     move.b    d1,tpt_rltv_vol(a5)
  9532.     bra    @f
  9533. 1:
  9534.     moveq.l    #0,d1
  9535.     move.b    tpt_rltv_vol(a5),d1
  9536. @@:
  9537.     moveq.l    #rltv_vol_zmd,d0
  9538.     bsr    do_wrt_trk_b
  9539.     move.l    d1,d0
  9540.     bsr    do_wrt_trk_b
  9541.     tst.b    seq_cmd-work(a6)
  9542.     beq    mml_lp
  9543.     rts
  9544.  
  9545. mml_midi_data:            *[MIDI_DATA]
  9546.     bsr    skip_spc
  9547.     cmp.l    a4,d4
  9548.     bls    m_parameter_cannot_be_omitted
  9549.     cmpi.b    #'{',(a4)
  9550.     bne    mml_@x
  9551.     addq.w    #1,a4
  9552. mml_@x:                    *MIDI data transmit
  9553.     moveq.l    #midi_transmission_zmd,d0        *send cmd code
  9554.     bsr    do_wrt_trk_b
  9555.     moveq.l    #0,d0            *no comment
  9556.     bsr    do_wrt_trk_b        *comment length
  9557.     move.l    tpt_now(a5),d5
  9558.     bsr    do_wrt_trk_l        *データ長サイズ分ダミーデータの書き込みでリザーブ
  9559.     move.l    #$ff,d2            *check over $7f
  9560.     bsr    wrt_send_data        *>d2.l=data length
  9561.     tst.l    d2
  9562.     beq    m_parameter_cannot_be_omitted    *値が一個もない時はエラー
  9563.     move.l    tpt_addr(a5),a1
  9564.     add.l    d5,a1
  9565.     rept    4
  9566.     rol.l    #8,d2
  9567.     move.b    d2,(a1)+        *サイズ書き込み
  9568.     endm
  9569.     tst.b    seq_cmd-work(a6)
  9570.     beq    mml_lp
  9571.     bsr    skip_spc
  9572.     cmp.l    a4,d4
  9573.     bls    m_illegal_command_line
  9574.     cmpi.b    #'}',(a4)
  9575.     bne    @f
  9576.     addq.w    #1,a4
  9577. @@:
  9578.     rts
  9579.  
  9580. mml_nrpn:            *[NRPN]
  9581. mml_@y:                *@Y コマンド
  9582.     bsr    chk_num
  9583.     bmi    m_parameter_cannot_be_omitted    *値が一個もない時はエラー
  9584.     moveq.l    #NRPN_zmd,d0
  9585.     bsr    do_wrt_trk_b
  9586.     moveq.l    #$7f,d2            *limit
  9587.     bsr    wrt_send_data        *>d2.l=n of data
  9588.     cmpi.l    #3,d2            *LSB省略か
  9589.     bcs    1f
  9590.     beq    @f
  9591.     cmpi.l    #4,d2
  9592.     bhi    m_too_many_parameters    *データがない
  9593.     tst.b    seq_cmd-work(a6)
  9594.     beq    mml_lp
  9595.     rts
  9596. @@:
  9597.     moveq.l    #-1,d0            *LSBが省略
  9598.     bsr    do_wrt_trk_b
  9599.     tst.b    seq_cmd-work(a6)
  9600.     beq    mml_lp
  9601.     rts
  9602. 1:
  9603.     cmpi.w    #2,d2
  9604.     bcs    m_parameter_shortage
  9605.     moveq.l    #-1,d0            *データ全部省略(アドレスの未指定)
  9606.     bsr    do_wrt_trk_w
  9607.     tst.b    seq_cmd-work(a6)
  9608.     beq    mml_lp
  9609.     rts
  9610.  
  9611. mml_aftertouch_level:            *[AFTERTOUCH.LEVEL]
  9612.     moveq.l    #aftertouch_zmd,d0
  9613.     bsr    do_wrt_trk_b
  9614.     bsr    skip_spc
  9615.     cmp.l    a4,d4
  9616.     bls    m_parameter_cannot_be_omitted
  9617.     cmpi.b    #',',(a4)
  9618.     beq    1f
  9619.     lea    switch_strv2(pc),a1
  9620.     bsr    get_com_no
  9621.     bmi    1f
  9622.     subq.b    #1,d0            *-1,0,1,2
  9623.     beq    mal_off            *OFF
  9624.     bra    @f
  9625. 1:
  9626.     moveq.l    #0,d0            *no touch
  9627. @@:
  9628.     move.l    tpt_now(a5),d5        *あとでomtを格納するため
  9629.     bsr    do_wrt_trk_b        *mode
  9630.     moveq.l    #0,d0
  9631.     bsr    do_wrt_trk_w        *omt=0,rltvmark=0
  9632.     bsr    skip_sep
  9633.     bsr    get_@z_prm
  9634.     bsr    chk_num
  9635.     bpl    m_too_many_parameters    *パラメータ多すぎ
  9636.     move.l    tpt_addr(a5),a1
  9637.     lea    1(a1,d5.l),a1
  9638.     cmpi.w    #1,d6            *パラメータが複数あるか
  9639.     bcs    1f
  9640.     bne    @f
  9641.     move.b    #1,-1(a1)        *1つのときは強制的にoptional mode
  9642. @@:
  9643.     move.b    d6,(a1)+        *set omt
  9644.     beq    @f
  9645.     move.b    d3,(a1)+        *set rltvmark
  9646. @@:
  9647.     rts
  9648. 1:                    *rltvマークはいらない
  9649.     subq.l    #1,tpt_now(a5)
  9650.     rts
  9651.  
  9652. mal_off:
  9653.     moveq.l    #0,d0            *mode=0,omt=0 → OFF
  9654.     bra    do_wrt_trk_w
  9655.  
  9656. mml_@z:                    *アフタータッチ @Z
  9657.     moveq.l    #aftertouch_zmd,d0
  9658.     bsr    do_wrt_trk_b
  9659.     move.l    tpt_now(a5),d5        *あとでmode/omtを格納するため
  9660.     moveq.l    #0,d0
  9661.     bsr    do_wrt_trk_w        *2bytes確保(mode=0,omt=0)
  9662.     bsr    do_wrt_trk_b        *1bytes確保(rltvmark=0)
  9663.     bsr    get_@z_prm
  9664.     bsr    chk_num
  9665.     bpl    m_too_many_parameters    *パラメータ多すぎ
  9666.     move.l    tpt_addr(a5),a1
  9667.     add.l    d5,a1
  9668.     moveq.l    #1,d0            *optional mode
  9669.     cmpi.w    #1,d6            *パラメータが複数あるか
  9670.     bcs    1f
  9671.     beq    @f
  9672.     moveq.l    #-1,d0            *1/8 mode(複数の場合)
  9673. @@:
  9674.     move.b    d0,(a1)+        *mode
  9675.     move.b    d6,(a1)+        *set omt
  9676.     beq    mml_lp
  9677.     move.b    d3,(a1)+        *set rltvmark
  9678.     bra    mml_lp
  9679. 1:
  9680.     subq.l    #1,tpt_now(a5)
  9681.     bra    mml_lp
  9682.  
  9683. get_@z_prm:
  9684.     * > d6.b=omt
  9685.     moveq.l    #0,d6            *omt
  9686.     bsr    skip_spc
  9687.     cmp.l    a4,d4
  9688.     bls    exit_g@zp
  9689.     cmpi.b    #',',(a4)
  9690.     beq    @f
  9691.     bsr    chk_num
  9692.     bmi    exit_g@zp    *@zだけの場合はmode=0,omt=0でスイッチオフ
  9693. @@:
  9694.     moveq.l    #0,d2        *loop counter
  9695.     moveq.l    #0,d3        *previous value
  9696. mml_aftc_lp01:
  9697.     moveq.l    #0,d1
  9698.     bsr    chk_num
  9699.     bpl    @f
  9700.     cmp.l    a4,d4
  9701.     bls    exit_g@zp
  9702.     cmpi.b    #',',(a4)
  9703.     bne    exit_g@zp
  9704.     bsr    skip_sep    *skip ','
  9705.     bra    next_g@zp
  9706. @@:                *levelパラメータ有り
  9707.     move.b    (a4),d0
  9708.     cmpi.b    #'+',d0
  9709.     beq    @f
  9710.     cmpi.b    #'-',d0
  9711.     bne    1f
  9712. @@:                *相対指定ケース
  9713.     bsr    get_num
  9714.     cmpi.l    #127,d1
  9715.     bgt    m_illegal_aftertouch_value
  9716.     cmpi.l    #-128,d1
  9717.     blt    m_illegal_aftertouch_value
  9718.     bset.l    d2,d3            *set rltv mark
  9719.     bra    @f
  9720. 1:                *直値ケース
  9721.     bsr    get_num
  9722.     cmpi.l    #127,d1
  9723.     bhi    m_illegal_aftertouch_value    *値が7bit範囲より大きいとエラー
  9724. @@:
  9725.     bsr    skip_sep            *skip ','
  9726.     * < d1.l=aftertouch level
  9727.     bset.l    d2,d6            *set omt
  9728.     move.l    d1,d0
  9729.     bsr    do_wrt_trk_b    *level書き込み
  9730. next_g@zp:
  9731.     bsr    chk_num
  9732.     bpl    @f
  9733.     cmp.l    a4,d4
  9734.     bls    exit_g@zp
  9735.     cmpi.b    #',',(a4)    *まだパラメータがあるか
  9736.     bne    exit_g@zp
  9737. @@:
  9738.     addq.w    #1,d2
  9739.     cmpi.w    #aftc_max,d2
  9740.     bcs    mml_aftc_lp01
  9741. exit_g@zp:
  9742.     rts
  9743.  
  9744. mml_r:                *R 休符
  9745.     btst.b    #c_renp1,tpt_mode_flg(a5)
  9746.     beq    @f
  9747.     addq.l    #1,tpt_renp_cnt(a5)    *連符内なら個数をインクリメント
  9748. @@:
  9749.     moveq.l    #rest_zmd,d2
  9750.     bra    knnn
  9751.  
  9752. mml_@w:                *@W ウェイト
  9753.     btst.b    #c_renp1,tpt_mode_flg(a5)
  9754.     beq    @f
  9755.     addq.l    #1,tpt_renp_cnt(a5)    *連符内なら個数をインクリメント
  9756. @@:
  9757.     moveq.l    #0,d1        *音長格納
  9758.     moveq.l    #wait_zmd,d2
  9759.     bra    knnn
  9760.  
  9761. mml_ag:                *キーコード
  9762.     * < d1.w=(0~6)*2
  9763.     btst.b    #c_renp1,tpt_mode_flg(a5)
  9764.     beq    @f
  9765.     addq.l    #1,tpt_renp_cnt(a5)    *連符内なら個数をインクリメント
  9766. @@:
  9767.     lsr.w    #1,d1            */2
  9768.     bsr    get_key            *key codeを得る
  9769.     move.b    d0,d2            *save kc
  9770. knnn:
  9771.     move.l    arry_stock(pc),a3        *今回の結果をストアするワーク
  9772.     bclr.b    #c_step,tpt_mode_flg(a5)    *initialize the work
  9773.     bclr.b    #c_gate,tpt_mode_flg(a5)    *initialize the work
  9774.     move.b    #$80,vl_buf-work(a6)
  9775.     move.b    d2,nt_buf-work(a6)
  9776.     bmi    @f                *通常音符は
  9777.     bsr    velocity_sequence        *ベロシティシーケンス実行
  9778. @@:
  9779.     bsr    get_ag_length            *音長等のパラメータ取得
  9780.     moveq.l    #0,d0
  9781.     move.b    nt_buf(pc),d0
  9782.     bmi    @f
  9783.     tst.w    step_buf-work(a6)        *d3.w=step
  9784.     bne    @f
  9785.     btst.b    #c_gate,tpt_mode_flg(a5)    *V2コンパチの音長0ノートか
  9786.     bne    @f
  9787.     bsr    skip_spc
  9788.     cmp.l    a4,d4
  9789.     bls    v2_len0_note            *YES(ST=0,GT=0)
  9790.     cmpi.b    #'&',(a4)            *tieかどうか
  9791.     bne    v2_len0_note            *TIEじゃなくて(ST=0,GT=0)
  9792. @@:
  9793.     bsr    scan_prev_notes            *以前鳴ったものとの比較
  9794.     move.w    step_buf(pc),d3            *d3.w=step
  9795.     btst.b    #c_renp2,tpt_mode_flg(a5)    *↑連符処理(PASS2)
  9796.     beq    chk_wk_echo
  9797.     move.w    tpt_renp_length(a5),d3
  9798.     tst.w    tpt_renp_surplus(a5)
  9799.     beq    @f
  9800.     addq.w    #1,d3
  9801.     subq.w    #1,tpt_renp_surplus(a5)        *↓連符処理(PASS2)
  9802. @@:
  9803.     move.w    d3,step_buf-work(a6)
  9804. chk_wk_echo:
  9805.     tst.b    d0
  9806.     bmi    wrt_kc_ag        *@W,Rはエコーなし
  9807.     tst.b    tpt_echo_switch(a5)
  9808.     beq    wrt_kc_ag
  9809.     cmp.w    tpt_echo_dly(a5),d3    *dly方が大きい場合は処理なし
  9810.     bhi    echo_case
  9811. wrt_kc_ag:
  9812.     * < d0.w=note number
  9813.     * < d3.w=step_buf
  9814.     move.w    d0,(a3)+        *flag=0,note(b)
  9815.     bsr    do_wrt_trk_b        *write kc
  9816.     move.l    d3,d0
  9817.     bsr    consider_trkfrq_st    *trkfrqを考慮する(step)
  9818.     jsr    do_wrt_trk_v        *set step time
  9819.     cmpi.b    #wait_zmd,d2
  9820.     beq    exit_ag            *Gatetime/Velocityなし
  9821.     bsr    skip_spc
  9822.     cmp.l    a4,d4
  9823.     bls    @f
  9824.     cmpi.b    #'&',(a4)        *tieかどうか
  9825.     bne    @f
  9826.     addq.w    #1,a4
  9827.     move.w    #TIE_GATE,d0        *tie case
  9828.     bra    set_gt
  9829. @@:
  9830.     move.w    gate_buf(pc),d0
  9831.     btst.b    #c_gate,tpt_mode_flg(a5)
  9832.     bne    @f
  9833.     move.w    step_buf(pc),d0
  9834.     bsr    calc_gt            *> d0=gate time
  9835. @@:
  9836.     * < d0.w=gate time(0-)
  9837.     bsr    consider_trkfrq_gt    *trkfrqを考慮する
  9838. set_gt:
  9839.     move.w    d0,(a3)+        *gate time
  9840.     bpl    @f
  9841.     move.l    tpt_now(a5),(a3)
  9842.     bsr    do_wrt_trk_w        *TIE($8000)
  9843.     bra    wrt_vel_ag
  9844. @@:
  9845.     st.b    -3(a3)            *通常ノートなら書き換えフェーズ考慮不要
  9846.     jsr    do_wrt_trk_v        *set gate time
  9847. wrt_vel_ag:
  9848.     move.l    #-1,4(a3)        *endcode
  9849.     cmpi.b    #rest_zmd,d2
  9850.     beq    exit_ag            *休符はベロシティなし
  9851.     move.b    vl_buf(pc),d0
  9852.     bsr    do_wrt_trk_b        *velocity
  9853. exit_ag:
  9854.     bsr    rewrite_note_gate
  9855.     bsr    preserve_this_note    *今回の発音内容を保存
  9856.     bra    mml_lp
  9857.  
  9858. v2_len0_note:                *V2 音長0ノート
  9859.     moveq.l    #len0_note_zmd,d0
  9860.     bsr    do_wrt_trk_b
  9861.     move.b    nt_buf(pc),d0
  9862.     bsr    do_wrt_trk_b
  9863.     move.b    vl_buf(pc),d0
  9864.     bsr    do_wrt_trk_b        *velocity
  9865.     bra    mml_lp
  9866.  
  9867. echo_case:                *疑似エコー・プリプロセッシング(単音)
  9868.     * < d3.w=step_buf
  9869.     bsr    skip_spc
  9870.     cmp.l    a4,d4
  9871.     bls    @f
  9872.     cmpi.b    #'&',(a4)        *tieかどうか
  9873.     bne    @f
  9874.     addq.w    #1,a4
  9875.     move.w    #TIE_GATE,d1
  9876.     bra    echo_set_ag
  9877. @@:                    *タイ/スラーなし
  9878.     move.w    gate_buf(pc),d0
  9879.     btst.b    #c_gate,tpt_mode_flg(a5)
  9880.     bne    @f
  9881.     move.w    d3,d0
  9882.     bsr    calc_gt            *> d0=gate time
  9883. @@:
  9884.     * < d0.w=gate time(0-)
  9885.     bsr    consider_trkfrq_gt    *trkfrqを考慮する
  9886.     move.l    d0,d1            *d1.w=gate
  9887. echo_set_ag:
  9888.     move.w    tpt_echo_loop(a5),d2
  9889.     subq.w    #1,d2            *for dbra
  9890.     moveq.l    #0,d5
  9891.     move.b    vl_buf(pc),d5
  9892.     cmpi.b    #$80,d5
  9893.     bne    @f
  9894.     move.w    #192,d5            *nuetral:192
  9895. @@:
  9896.     move.b    tpt_echo_vdec(a5),d6    *減衰量
  9897.     ext.w    d6
  9898. echopelp:                *ベロシティが絶対値あるいは相対値指定の場合
  9899.     tst.w    d1
  9900.     beq    @f
  9901.     moveq.l    #0,d0
  9902.     move.b    nt_buf(pc),d0
  9903.     move.w    d0,(a3)+        *flag=0,note(b)
  9904.     bra    1f
  9905. @@:
  9906.     moveq.l    #wait_zmd,d0        *gate=0ならばウェイトとする
  9907. 1:
  9908.     bsr    do_wrt_trk_b        *write kc
  9909.     move.w    tpt_echo_dly(a5),d0
  9910.     tst.w    d2            *最後ならばd3がstep
  9911.     beq    1f
  9912.     cmp.w    d0,d3
  9913.     bcc    @f
  9914. 1:
  9915.     move.w    d3,d0
  9916. @@:
  9917.     bsr    do_wrt_trk_v        *step
  9918.     move.w    tpt_echo_dly(a5),d0
  9919.     tst.w    d1
  9920.     beq    echope_next        *gate=0ならばウェイトなので以下の処理いらず
  9921.     bpl    @f
  9922.     tst.w    d2            *tie case
  9923.     bne    2f
  9924.     move.w    #TIE_GATE,d0        *タイ時最後ならば
  9925.     bra    2f
  9926. @@:
  9927.     tst.w    d2
  9928.     bne    1f
  9929.     move.w    d1,d0            *最後は残り全部gate
  9930.     bra    2f
  9931. 1:
  9932.     sub.w    d0,d1
  9933. 2:
  9934.     move.w    d0,(a3)+        *gate time
  9935.     bpl    @f
  9936.     move.l    tpt_now(a5),(a3)+
  9937.     bsr    do_wrt_trk_w        *tie
  9938.     bra    wrt_vel_ag_ec
  9939. @@:
  9940.     st.b    -3(a3)            *通常ノートなら書き換えフェーズ考慮不要
  9941.     addq.w    #4,a3
  9942.     bsr    do_wrt_trk_v        *set gate time
  9943. wrt_vel_ag_ec:
  9944.     move.l    #-1,(a3)        *endcode
  9945.     move.b    d5,d0
  9946.     bsr    do_wrt_trk_b        *velocity
  9947.     tst.b    d5
  9948.     bpl    ech_absvlo
  9949.     add.w    d6,d5            *減衰処理
  9950.     cmpi.w    #129,d5
  9951.     bcc    @f
  9952.     move.w    #129,d5
  9953.     bra    echope_next
  9954. @@:
  9955.     cmpi.w    #255,d5
  9956.     bls    echope_next
  9957.     move.w    #255,d5
  9958.     bra    echope_next
  9959. ech_absvlo:                *ベロシティが絶対値指定の場合
  9960.     add.w    d6,d5            *減衰処理
  9961.     bpl    @f
  9962.     moveq.l    #0,d5
  9963.     bra    echope_next
  9964. @@:
  9965.     cmp.w    #127,d5
  9966.     bls    echope_next
  9967.     moveq.l    #127,d5
  9968. echope_next:
  9969.     sub.w    tpt_echo_dly(a5),d3
  9970.     bls    @f
  9971.     dbra    d2,echopelp
  9972.     tst.w    tpt_echo_loop(a5)    *無限ループケース
  9973.     beq    echopelp
  9974. @@:
  9975.     bsr    rewrite_note_gate
  9976.     bsr    preserve_this_note    *今回の発音内容を保存
  9977.     bra    mml_lp
  9978.  
  9979. get_length:            *get 音長
  9980.     * > d0.w=length
  9981.     * - all
  9982.     movem.l    d1/a1,-(sp)
  9983.     bsr    get_num        *>d0.l=number value
  9984.     tst.b    step_input-work(a6)
  9985.     beq    @f
  9986.     move.l    d1,d0        *ステップ入力モードの時はすべての音長が
  9987.     bra    exit_gtln    *ステップタイムにて表される
  9988. @@:
  9989.     tst.l    d1
  9990.     beq    m_illegal_note_length    *0は駄目
  9991.     moveq.l    #0,d0
  9992.     move.l    zmd_addr(pc),a1
  9993.     move.w    z_master_clock(a1),d0
  9994.     cmp.l    d0,d1
  9995.     bhi    m_illegal_note_length    *絶対音長が0以下になってしまう
  9996.     divu    d1,d0
  9997.     bvs    m_illegal_note_length    *絶対音長が大きすぎる
  9998. exit_gtln:
  9999.     move.l    d0,d1
  10000.     swap    d1
  10001.     tst.w    d1
  10002.     beq    @f
  10003.     bsr    m_surplus_in_division    *余りが発生している
  10004. @@:
  10005.     andi.l    #$ffff,d0
  10006.     cmp.l    #max_note_len,d0
  10007.     bhi    m_illegal_note_length    *絶対音長が大きすぎる
  10008.     movem.l    (sp)+,d1/a1
  10009.     rts
  10010.  
  10011. futen_ope:            *符点処理
  10012.     * < d0.w=length
  10013.     * > d1.w=real length
  10014.     move.w    d0,d1
  10015. fop__lp:
  10016.     * < d1.w=total length
  10017.     * < d0.w=futen sorce length
  10018.     bsr    skip_spc
  10019.     cmp.l    a4,d4
  10020.     bls    exit_fto
  10021.     cmpi.b    #'.',(a4)
  10022.     bne    @f
  10023.     addq.w    #1,a4
  10024.     btst.b    #c_renp1,tpt_mode_flg(a5)    *連符内に符点指定は出来ない
  10025.     bne    m_group_notes_command_error
  10026.     lsr.w    #1,d0
  10027.     add.w    d0,d1
  10028. for_ftlp:
  10029.     bmi    m_illegal_note_length
  10030.     cmpi.w    #max_note_len,d1
  10031.     bhi    m_illegal_note_length
  10032.     bra    fop__lp
  10033. @@:                *PC98式タイ
  10034.     bsr    skip_spc
  10035.     cmp.l    a4,d4
  10036.     bls    exit_fto
  10037.     cmpi.b    #'^',(a4)
  10038.     bne    exit_fto
  10039.     addq.w    #1,a4        *skip '^'
  10040.     bsr    chk_num
  10041.     bmi    abstie
  10042.     cmpi.b    #'-',(a4)
  10043.     bne    @f
  10044.     addq.w    #1,a4
  10045.     bsr    get_length    *> d0.l
  10046.     sub.w    d0,d1
  10047.     bmi    m_illegal_note_length
  10048.     bra    for_ftlp
  10049. @@:
  10050.     bsr    get_length    *> d0.l
  10051.     add.w    d0,d1
  10052.     bmi    m_illegal_note_length
  10053.     bra    for_ftlp
  10054. abstie:                *絶対音長指定
  10055.     bsr    skip_spc
  10056.     cmp.l    a4,d4
  10057.     bls    exit_fto
  10058.     move.b    (a4),d0
  10059.     cmp.b    #'*',d0
  10060.     bne    onlytie
  10061.     addq.w    #1,a4        *skip '*'
  10062.     bsr    chk_num
  10063.     bmi    m_syntax_error    *no length value
  10064.     cmpi.b    #'-',(a4)
  10065.     bne    @f
  10066.     addq.w    #1,a4
  10067.     move.w    d1,-(sp)
  10068.     bsr    get_num        *>d1.l=value
  10069.     move.w    (sp)+,d0
  10070.     sub.w    d1,d0
  10071.     bmi    m_illegal_note_length
  10072.     move.l    d0,d1
  10073.     bra    for_ftlp
  10074. @@:
  10075.     move.w    d1,-(sp)
  10076.     bsr    get_num        *>d1.l=value
  10077.     move.l    d1,d0
  10078.     add.w    (sp)+,d1
  10079.     bmi    m_illegal_note_length
  10080.     bra    for_ftlp
  10081. onlytie:            *'^'のみの場合
  10082.     move.w    tpt_note_len(a5),d0
  10083.     add.w    d0,d1
  10084.     bra    for_ftlp
  10085. exit_fto:
  10086.     rts
  10087.  
  10088. chk_chogo:            *調号チェック
  10089.     * > d1=+1~-1
  10090.     * - d0
  10091.     move.w    d0,-(sp)
  10092.     moveq.l    #0,d1
  10093. chk_chogo_lp:
  10094.     bsr    skip_spc
  10095.     cmp.l    a4,d4
  10096.     bls    exit_chk_chogo
  10097.     move.b    (a4),d0
  10098.     cmpi.b    #'#',d0
  10099.     beq    case_sharp
  10100.     cmpi.b    #'+',d0
  10101.     beq    case_sharp
  10102.     cmpi.b    #'-',d0
  10103.     bne    exit_chk_chogo
  10104.     tst.b    step_input-work(a6)
  10105.     beq    case_flat
  10106.     addq.w    #1,a4        *ステップ入力モードにおいて「--1」などのケースに対応
  10107.     cmp.l    a4,d4
  10108.     bls    @f
  10109.     move.b    (a4),d0
  10110.     cmpi.b    #'0',d0
  10111.     bcs    @f
  10112.     cmpi.b    #'9',d0
  10113.     bhi    @f
  10114.     subq.w    #1,a4
  10115. exit_chk_chogo:
  10116.     move.w    (sp)+,d0
  10117.     rts
  10118.  
  10119. case_flat:
  10120.     addq.w    #1,a4
  10121. @@:
  10122.     subq.b    #1,d1        *-1
  10123.     bra    chk_chogo_lp
  10124.  
  10125. case_sharp:
  10126.     addq.w    #1,a4
  10127.     addq.b    #1,d1        *+1
  10128.     bra    chk_chogo_lp
  10129.  
  10130. get_key:            *キーコードを得る
  10131.     * < d1.w=(a~g:0-6)
  10132.     * > d0.l=note number
  10133.     * - all except d0-d1
  10134. reglist    reg    d2-d3/a1
  10135.     movem.l    reglist,-(sp)
  10136.     moveq.l    #0,d3
  10137.     moveq.l    #0,d0
  10138.     move.b    kc_value(pc,d1.w),d0    *d0=0~11(kc)
  10139.     bsr    skip_spc2
  10140.     cmpi.b    #'!',(a4)
  10141.     bne    @f
  10142.     addq.w    #1,a4
  10143.     bra    gk0
  10144. @@:
  10145.     add.b    tpt_key_sig(a5,d1.w),d0    *調号考慮
  10146. gk0:
  10147.     tst.b    step_input-work(a6)
  10148.     beq    @f            *step入力モードでは
  10149.     bsr    chk_chogo
  10150.     move.l    d1,d3            *step入力モード調号
  10151.     bsr    chk_num            *音階記号の後に付く数値は
  10152.     bmi    @f            *オクターブ
  10153.     bsr    get_num            *ex.)C4 = O4C
  10154.     addq.l    #1,d1
  10155.     cmpi.l    #10,d1
  10156.     bhi    m_illegal_octave
  10157.     bra    muloctv
  10158. @@:
  10159.     move.b    tpt_octave(a5),d1
  10160. muloctv:
  10161.     add.b    d1,d1            *2
  10162.     add.b    d1,d1            *4
  10163.     move.b    d1,d2            *d2=d1*4
  10164.     add.b    d1,d1            *8
  10165.     add.b    d2,d1            *12
  10166.     add.b    d1,d0            *d0=オクターブを考慮したキー値(0~127)
  10167.     bsr    chk_chogo        *♭・♯のチェック
  10168.     add.b    d1,d0
  10169.     add.b    d3,d0            *step入力モード調号加算
  10170. *    add.b    tpt_transpose(a5),d0    *キートランスポーズをチェック
  10171.     cmpi.b    #$7f,d0
  10172.     bhi    m_illegal_note_number
  10173.     lea    tpt_note_tbl(a5),a1
  10174.     move.b    (a1,d0.w),d0
  10175.     movem.l    (sp)+,reglist
  10176.     tst.b    step_input-work(a6)
  10177.     beq    @f            *step入力モードでは
  10178.     bra    skip_sep2
  10179. @@:
  10180.     rts
  10181. kc_value:    *A  B  C  D  E  F  G
  10182.     dc.b    09,11,00,02,04,05,07
  10183.     .even
  10184.  
  10185. skip_plus:            *PLUSをスキップする
  10186.     move.w    d0,-(sp)
  10187. skpllp:
  10188.     cmp.l    a4,d4
  10189.     bls    exit_skpl
  10190.     move.b    (a4)+,d0
  10191.     cmpi.b    #'/',d0
  10192.     bne    @f
  10193.     bsr    do_skip_comment
  10194.     bra    skpllp
  10195. @@:
  10196.     btst.b    #0,now_cmd-work(a6)    *(tN)でのMMLコンパイル中か
  10197.     bne    @f
  10198.     cmpi.b    #$0d,d0
  10199.     beq    skpllp
  10200.     cmpi.b    #$0a,d0
  10201.     bne    @f
  10202.     bsr    cr_line
  10203.     bra    skpllp
  10204. @@:
  10205.     cmpi.b    #'+',d0
  10206.     beq    skpllp
  10207.     subq.w    #1,a4
  10208. exit_skpl:
  10209.     move.l    a4,line_ptr-work(a6)
  10210.     move.w    (sp)+,d0
  10211.     rts
  10212.  
  10213. skip_eq:            *'='をスキップする(スペースやタブも)
  10214.     move.w    d0,-(sp)
  10215. skip_eq_lp:
  10216.     cmp.l    a4,d4
  10217.     bls    exit_eql
  10218.     move.b    (a4)+,d0
  10219.     cmpi.b    #'/',d0
  10220.     bne    @f
  10221.     bsr    do_skip_comment
  10222.     bra    skip_eq_lp
  10223. @@:
  10224.     cmpi.b    #' ',d0
  10225.     beq    skip_eq_lp
  10226.     cmpi.b    #09,d0
  10227.     beq    skip_eq_lp
  10228.     cmpi.b    #'=',d0        *OPMD CNF FILEのケース
  10229.     beq    skip_eq_lp
  10230.     cmpi.b    #':',d0
  10231.     beq    skip_eq_lp
  10232.     cmpi.b    #',',d0
  10233.     beq    skip_eq_lp
  10234.     tst.b    seq_cmd-work(a6)
  10235.     bne    1f
  10236.     btst.b    #0,now_cmd-work(a6)    *(tN)でのMMLコンパイル中か
  10237.     bne    @f
  10238. 1:
  10239.     cmpi.b    #$0d,d0
  10240.     beq    skip_eq_lp
  10241.     cmpi.b    #$0a,d0
  10242.     bne    @f
  10243.     bsr    cr_line
  10244.     bra    skip_eq_lp
  10245. @@:
  10246.     subq.w    #1,a4
  10247. exit_eql:
  10248.     move.l    a4,line_ptr-work(a6)
  10249.     move.w    (sp)+,d0
  10250.     rts
  10251.  
  10252. skip_sep:            *セパレータを1個だけスキップする
  10253.     move.w    d0,-(sp)    *(スペース/タブ/改行は複数スキップする)
  10254. skip_sep_lp:
  10255.     cmp.l    a4,d4
  10256.     bls    exit_ssl
  10257.     move.b    (a4)+,d0
  10258.     cmpi.b    #'/',d0
  10259.     bne    @f
  10260.     bsr    do_skip_comment
  10261.     bra    skip_sep_lp
  10262. @@:
  10263.     cmpi.b    #' ',d0
  10264.     beq    skip_sep_lp
  10265.     cmpi.b    #09,d0
  10266.     beq    skip_sep_lp
  10267.     cmpi.b    #',',d0
  10268.     beq    exit_ssl
  10269. *    cmpi.b    #':',d0
  10270. *    beq    exit_ssl
  10271. *    cmpi.b    #'=',d0        *OPMD CNF FILEのケース
  10272. *    beq    exit_ssl
  10273.     tst.b    seq_cmd-work(a6)
  10274.     bne    1f
  10275.     btst.b    #0,now_cmd-work(a6)    *(tN)でのMMLコンパイル中か
  10276.     bne    @f
  10277. 1:
  10278.     cmpi.b    #$0d,d0
  10279.     beq    skip_sep_lp
  10280.     cmpi.b    #$0a,d0
  10281.     bne    @f
  10282.     bsr    cr_line
  10283.     bra    skip_sep_lp
  10284. @@:
  10285.     subq.w    #1,a4
  10286. exit_ssl:
  10287.     move.l    a4,line_ptr-work(a6)
  10288.     move.w    (sp)+,d0
  10289.     rts
  10290.  
  10291. skip_sep2:            *セパレータ','を1個だけスキップする
  10292.     movem.l    d0-d1,-(sp)    *(スペース/タブは複数スキップ、改行はスキップしない)
  10293.     moveq.l    #0,d1
  10294. skip_sep2_lp:
  10295.     cmp.l    a4,d4
  10296.     bls    exit_ss2l
  10297.     move.b    (a4)+,d0
  10298.     cmpi.b    #' ',d0
  10299.     beq    skip_sep2_lp
  10300.     cmpi.b    #09,d0
  10301.     beq    skip_sep2_lp
  10302.     cmpi.b    #',',d0
  10303.     bne    @f
  10304.     tas.b    d1
  10305.     beq    skip_sep2_lp
  10306.     bra    1f
  10307. @@:
  10308. *    cmpi.b    #':',d0
  10309. *    beq    exit_ss2l
  10310. *    cmpi.b    #'=',d0        *OPMD CNF FILEのケース
  10311. *    beq    exit_ss2l
  10312. 1:
  10313.     subq.w    #1,a4
  10314. exit_ss2l:
  10315.     move.l    a4,line_ptr-work(a6)
  10316.     movem.l    (sp)+,d0-d1
  10317.     rts
  10318.  
  10319. skip_spc:            *スペースをスキップする
  10320.     move.w    d0,-(sp)    *(複数のスペース/タブをスキップ、改行もスキップ)
  10321. sksplp:
  10322.     cmp.l    a4,d4
  10323.     bls    exit_sksp
  10324.     move.b    (a4)+,d0
  10325.     cmpi.b    #'/',d0
  10326.     bne    @f
  10327.     bsr    do_skip_comment
  10328.     bra    sksplp
  10329. @@:
  10330.     cmpi.b    #' ',d0
  10331.     beq    sksplp
  10332.     cmpi.b    #09,d0        *skip tab
  10333.     beq    sksplp
  10334.     tst.b    seq_cmd-work(a6)
  10335.     bne    1f
  10336.     btst.b    #0,now_cmd-work(a6)    *(tN)でのMMLコンパイル中か
  10337.     bne    @f            *ne:yes
  10338. 1:
  10339.     cmpi.b    #$0d,d0
  10340.     beq    sksplp
  10341.     cmpi.b    #$0a,d0
  10342.     bne    @f
  10343.     bsr    cr_line
  10344.     bra    sksplp
  10345. @@:
  10346.     subq.w    #1,a4
  10347. exit_sksp:
  10348.     move.l    a4,line_ptr-work(a6)
  10349.     move.w    (sp)+,d0
  10350.     rts
  10351.  
  10352. skip_spc0:            *スペースをスキップする(chk_num専用)
  10353.     move.w    d0,-(sp)    *(複数のスペース/タブをスキップ、改行もスキップ
  10354. sksplp0:            *ただし、テンポラリ的にスキップ)
  10355.     cmp.l    a4,d4
  10356.     bls    exit_sksp0
  10357.     move.b    (a4)+,d0
  10358.     cmpi.b    #'/',d0
  10359.     bne    @f
  10360.     bsr    do_skip_comment
  10361.     bra    sksplp0
  10362. @@:
  10363.     cmpi.b    #' ',d0
  10364.     beq    sksplp0
  10365.     cmpi.b    #09,d0            *skip tab
  10366.     beq    sksplp0
  10367.     tst.b    seq_cmd-work(a6)
  10368.     bne    1f
  10369.     btst.b    #0,now_cmd-work(a6)    *(tN)でのMMLコンパイル中か
  10370.     bne    @f            *ne:yes
  10371. 1:
  10372.     cmpi.b    #$0d,d0
  10373.     beq    sksplp0
  10374.     cmpi.b    #$0a,d0
  10375.     beq    sksplp0
  10376. @@:
  10377.     subq.w    #1,a4
  10378. exit_sksp0:
  10379. *    move.l    a4,line_ptr-work(a6)
  10380.     move.w    (sp)+,d0
  10381.     rts
  10382.  
  10383. skip_spc1:            *スペースを1個だけスキップする
  10384.     move.w    d0,-(sp)    *(スペースやタブも1個だけならスキップ)
  10385. sksp1_lp:
  10386.     cmp.l    a4,d4
  10387.     bls    exit_sksp1
  10388.     move.b    (a4)+,d0
  10389.     cmpi.b    #'/',d0
  10390.     bne    @f
  10391.     bsr    do_skip_comment
  10392.     bra    sksp1_lp
  10393. @@:
  10394.     cmpi.b    #09,d0        *skip tab
  10395.     beq    exit_sksp1
  10396.     cmpi.b    #' ',d0
  10397.     beq    exit_sksp1
  10398.     subq.w    #1,a4
  10399. exit_sksp1:
  10400.     move.l    a4,line_ptr-work(a6)
  10401.     move.w    (sp)+,d0
  10402.     rts
  10403.  
  10404. skip_spc2:            *スペース/TABをスキップする
  10405.     move.w    d0,-(sp)    *(複数のスペース/TABをスキップ、改行はスキップしない)
  10406. sksp2_lp:
  10407.     cmp.l    a4,d4
  10408.     bls    exit_sksp2
  10409.     move.b    (a4)+,d0
  10410.     cmpi.b    #'/',d0
  10411.     bne    @f
  10412.     bsr    do_skip_comment
  10413.     bra    sksp2_lp
  10414. @@:
  10415.     cmpi.b    #' ',d0
  10416.     beq    sksp2_lp
  10417.     cmpi.b    #09,d0        *skip tab
  10418.     beq    sksp2_lp
  10419.     subq.w    #1,a4
  10420. exit_sksp2:
  10421.     move.l    a4,line_ptr-work(a6)
  10422.     move.w    (sp)+,d0
  10423.     rts
  10424.  
  10425. skip_spc3:            *スペース/TABをスキップする。コメントはスキップしない(.KEY用)
  10426.     move.w    d0,-(sp)    *(複数のスペース/TABをスキップ、改行はスキップしない)
  10427. @@:
  10428.     cmp.l    a4,d4
  10429.     bls    @f
  10430.     move.b    (a4)+,d0
  10431.     cmpi.b    #' ',d0
  10432.     beq    @b
  10433.     cmpi.b    #09,d0        *skip tab
  10434.     beq    @b
  10435.     subq.w    #1,a4
  10436. @@:
  10437.     move.l    a4,line_ptr-work(a6)
  10438.     move.w    (sp)+,d0
  10439.     rts
  10440.  
  10441. chk_num:            *数字かどうかチェック(2進,16進数値の有無に付いても検知)
  10442.     * > eq=number
  10443.     * > mi=not num
  10444. reglist    reg    d0/a4
  10445.     movem.l    reglist,-(sp)
  10446. chknumlp:
  10447.     bsr    skip_spc0
  10448.     cmp.l    a4,d4
  10449.     bls    not_num
  10450.     move.b    (a4),d0
  10451.     cmpi.b    #'%',d0
  10452.     beq    bin_numchk
  10453.     cmpi.b    #'$',d0
  10454.     beq    hex_numchk
  10455.     cmpi.b    #'-',d0
  10456.     beq    @f
  10457.     cmpi.b    #'+',d0
  10458.     bne    chknum0
  10459. @@:                *もう一度検査へ
  10460.     addq.w    #1,a4
  10461.     bra    chknumlp
  10462. chknum0:
  10463.     cmpi.b    #'0',d0
  10464.     bcs    not_num
  10465.     cmpi.b    #'9',d0
  10466.     bhi    not_num
  10467. yes_num:
  10468.     movem.l    (sp)+,reglist
  10469.     move.w    #CCR_ZERO,ccr
  10470.     rts
  10471.  
  10472. bin_numchk:            *2進ケース
  10473.     addq.w    #1,a4        *skip %
  10474.     bsr    skip_spc0
  10475.     cmp.l    a4,d4
  10476.     bls    not_num
  10477.     move.b    (a4),d0
  10478.     cmpi.b    #'0',d0
  10479.     beq    yes_num
  10480.     cmpi.b    #'1',d0
  10481.     beq    yes_num
  10482. not_num:
  10483.     movem.l    (sp)+,reglist
  10484.     move.w    #CCR_NEGA,ccr
  10485.     rts
  10486.  
  10487. hex_numchk:            *16進ケース
  10488.     addq.w    #1,a4        *skip $
  10489.     bsr    skip_spc0
  10490.     cmp.l    a4,d4
  10491.     bls    not_num
  10492.     move.b    (a4),d0
  10493.     cmpi.b    #'0',d0
  10494.     bcs    not_num
  10495.     cmpi.b    #'9',d0
  10496.     bls    yes_num
  10497.     bsr    mk_capital
  10498.     cmpi.b    #'A',d0
  10499.     bcs    not_num
  10500.     cmpi.b    #'F',d0
  10501.     bhi    not_num
  10502.     bra    yes_num
  10503.  
  10504. chk_kanji:
  10505.     tst.b    d0
  10506.     bpl    @f        *normal characters
  10507.     cmpi.b    #$a0,d0        *漢字か
  10508.     bcs    cknj_yes
  10509.     cmpi.b    #$df,d0
  10510.     bls    @f
  10511. cknj_yes:
  10512.     move.w    #CCR_NEGA,ccr    *yes
  10513.     rts
  10514. @@:
  10515.     move.w    #CCR_ZERO,ccr    *no
  10516.     rts
  10517.  
  10518. reglist    reg    d1-d2/a1/a3
  10519. get_com_no2:            *コマンド文字列->数値変換
  10520.     * < a1=com_tbl
  10521.     * < a2=source
  10522.     * > d0=#cmd number
  10523.     * minus error
  10524.     * X a1,a3
  10525.     movem.l    reglist,-(sp)
  10526.     lea    do_get_cmd_num2(pc),a3
  10527.     bra    @f
  10528. get_com_no:            *コマンド文字列->数値変換
  10529.     * < a1=com_tbl
  10530.     * < a4=pointer
  10531.     * > d0=#cmd number
  10532.     * minus error
  10533.     * X a1
  10534.     movem.l    reglist,-(sp)
  10535.     lea    do_get_cmd_num(pc),a3
  10536. @@:
  10537.     bsr    skip_spc2
  10538.     moveq.l    #0,d2
  10539. wc_lp01:
  10540.     tst.b    (a1)
  10541.     bmi    exit_err_wc
  10542.     jsr    (a3)
  10543.     beq    exit_wc
  10544. @@:
  10545.     tst.b    (a1)+        *次のコマンド名へ
  10546.     bne    @b
  10547.     addq.b    #1,d2        *cmd number
  10548.     bra    wc_lp01
  10549. exit_err_wc:
  10550.     moveq.l    #-1,d0        *couldn't find it...
  10551.     movem.l    (sp)+,reglist
  10552.     rts
  10553. exit_wc:
  10554.     move.l    d2,d0        *d0=cmd number
  10555.     movem.l    (sp)+,reglist
  10556.     rts
  10557.  
  10558. do_get_cmd_num:            *実際に文字列を捜す
  10559.     * < a1=source str addr
  10560.     * > eq=get it!
  10561.     * > mi=can't found
  10562.     movem.l    d1/a1,-(sp)
  10563.     move.l    a4,d1        *save a4 to d1
  10564. @@:
  10565.     cmp.l    a4,d4
  10566.     bls    not_same_dgscn    *途中で終わった
  10567.     move.b    (a4)+,d0
  10568.     jsr    mk_capital-work(a6)    *小文字→大文字
  10569.     cmp.b    (a1)+,d0
  10570.     bne    not_same_dgscn
  10571.     tst.b    (a1)        *終了
  10572.     bne    @b
  10573.     movem.l    (sp)+,d1/a1
  10574.     moveq.l    #0,d0        *right!
  10575.     rts
  10576. not_same_dgscn:
  10577.     move.l    d1,a4        *get back a4
  10578.     movem.l    (sp)+,d1/a1
  10579.     moveq.l    #-1,d0        *error!
  10580.     rts
  10581.  
  10582. do_get_cmd_num2:        *実際に文字列を捜す
  10583.     * < a1=source str addr
  10584.     * > eq=get it!
  10585.     * > mi=can't found
  10586.     movem.l    d1/a1,-(sp)
  10587.     move.l    a2,d1        *save a2 to d1
  10588. @@:
  10589.     move.b    (a2)+,d0
  10590.     beq    not_same_dgscn2    *途中で終わった
  10591.     jsr    mk_capital-work(a6)    *小文字→大文字
  10592.     cmp.b    (a1)+,d0
  10593.     bne    not_same_dgscn2
  10594.     tst.b    (a1)        *終了
  10595.     bne    @b
  10596.     movem.l    (sp)+,d1/a1
  10597.     moveq.l    #0,d0        *right!
  10598.     rts
  10599. not_same_dgscn2:
  10600.     move.l    d1,a2        *get back a2
  10601.     movem.l    (sp)+,d1/a1
  10602.     moveq.l    #-1,d0        *error!
  10603.     rts
  10604.  
  10605. get_num:            *数字文字列を数値へ
  10606.     * < (a4)=number strings
  10607.     * < d4=end of text addr.
  10608.     * > d1.l=value
  10609.     * > a4=next
  10610.     * - all
  10611. reglist    reg    d0/d2-d3
  10612.     bsr    skip_spc    *' ',tabなどをskip
  10613.     cmp.l    a4,d4
  10614.     beq    num_ret
  10615.     movem.l    reglist,-(sp)
  10616.     cmpi.b    #'-',(a4)
  10617.     seq    d2           *'-'ならマーク
  10618.     bne    get_num0
  10619.     addq.w    #1,a4        *skip '-'
  10620. get_num0:
  10621.     bsr    skip_plus
  10622.     bsr    skip_spc
  10623.  
  10624.     cmpi.b    #'$',(a4)
  10625.     beq    get_hexnum_
  10626.     cmpi.b    #'%',(a4)
  10627.     beq    get_binnum_
  10628.  
  10629.     moveq.l    #0,d1
  10630.     moveq.l    #0,d0
  10631. num_lp01:
  10632.     cmp.l    a4,d4
  10633.     bls    num_exitt
  10634.     move.b    (a4)+,d0
  10635. *    cmpi.b    #'_',d0
  10636. *    beq    num_lp01
  10637.     sub.b    #$30,d0
  10638.     bmi    num_exit
  10639.     cmp.b    #9,d0
  10640.     bhi    num_exit
  10641.  
  10642.     add.l    d1,d1
  10643.     move.l    d1,d3
  10644.     lsl.l    #2,d1
  10645.     add.l    d3,d1        *d1=d1*10
  10646.     add.l    d0,d1        *d1=d1+d0
  10647.     bra    num_lp01
  10648. num_exit:
  10649.     subq.w    #1,a4
  10650. num_exitt:
  10651.     tst.b    d2
  10652.     beq    @f
  10653.     neg.l    d1
  10654. @@:
  10655.     movem.l    (sp)+,reglist
  10656. num_ret:
  10657.     rts
  10658. get_hexnum_:            *16進数
  10659.     moveq.l    #0,d0
  10660.     moveq.l    #0,d1
  10661.     cmp.l    a4,d4
  10662.     bls    num_exitt
  10663.     addq.w    #1,a4
  10664.     bsr    skip_spc
  10665. __num_lp01_:
  10666.     cmp.l    a4,d4
  10667.     bls    num_exitt
  10668.     move.b    (a4)+,d0
  10669. *    cmpi.b    #'_',d0
  10670. *    beq    __num_lp01_
  10671.     bsr    mk_capital
  10672.     sub.b    #$30,d0
  10673.     bmi    num_exit
  10674.     cmp.b    #9,d0
  10675.     bls    calc_hex_
  10676.     cmpi.b    #17,d0
  10677.     bcs    num_exit
  10678.     cmpi.b    #22,d0
  10679.     bhi    num_exit
  10680.     subq.b    #7,d0
  10681. calc_hex_:
  10682.     lsl.l    #4,d1
  10683.     or.b    d0,d1
  10684.     bra    __num_lp01_
  10685. get_binnum_:            *2進数
  10686.     moveq.l    #0,d0
  10687.     moveq.l    #0,d1
  10688.     cmp.l    a4,d4
  10689.     bls    num_exitt
  10690.     addq.w    #1,a4
  10691.     bsr    skip_spc
  10692. b__num_lp01_:
  10693.     cmp.l    a4,d4
  10694.     bls    num_exitt
  10695.     move.b    (a4)+,d0
  10696. *    cmpi.b    #'_',d0
  10697. *    beq    b__num_lp01_
  10698.     cmpi.b    #'0',d0
  10699.     beq    calc_b_num__
  10700.     cmpi.b    #'1',d0
  10701.     bne    num_exit
  10702. calc_b_num__:
  10703.     sub.b    #$30,d0
  10704.     add.l    d1,d1
  10705.     or.b    d0,d1
  10706.     bra    b__num_lp01_
  10707.  
  10708. mml_z:                *velocity sequence
  10709.     bsr    skip_spc
  10710.     bclr.b    #c_vseq,tpt_mode_flg(a5)    *off vseq
  10711.     cmp.l    a4,d4
  10712.     bls    mml_lp
  10713.     cmpi.b    #',',(a4)
  10714.     beq    @f
  10715.     bsr    chk_num
  10716.     bmi    mml_lp        *数値が一個もない時はスイッチオフ
  10717. @@:
  10718.     bset.b    #c_vseq,tpt_mode_flg(a5)
  10719.     moveq.l    #0,d3
  10720.     move.b    tpt_last_velo(a5),d3
  10721.     moveq.l    #velo_max-1,d2
  10722.     lea    tpt_velo(a5),a2
  10723. mml_zlp0:            *相対初期値の取り出し
  10724.     tst.b    (a2)+
  10725.     bmi    @f
  10726.     move.b    -1(a2),d3
  10727. @@:
  10728.     dbra    d2,mml_zlp0
  10729.     lea    tpt_velo(a5),a2
  10730.     moveq.l    #velo_max-1,d2
  10731. mml_z_lp:
  10732.     bsr    skip_spc
  10733.     cmp.l    a4,d4
  10734.     bls    exit_z_lp
  10735.     cmpi.b    #',',(a4)
  10736.     beq    z_use_default    *default velocity
  10737.     bsr    chk_num
  10738.     bmi    exit_z_lp
  10739.     cmpi.b    #'+',(a4)
  10740.     seq    d5
  10741.     beq    @f
  10742.     cmpi.b    #'-',(a4)
  10743.     seq    d5
  10744. @@:
  10745.     bsr    get_num
  10746.     move.l    d1,d0
  10747.  
  10748.     bsr    skip_sep    *skip ','
  10749.     tst.b    d5
  10750.     beq    @f
  10751.                 *相対を考慮
  10752.     move.l    d3,d0
  10753.     add.l    d1,d0
  10754.     cmpi.l    #127,d0
  10755.     bls    1f
  10756.     moveq.l    #0,d0
  10757.     tst.l    d1
  10758.     bmi    1f
  10759.     moveq.l    #127,d0
  10760.     bra    1f
  10761. @@:
  10762.     cmpi.l    #127,d0        *127より大きいとエラー
  10763.     bhi    m_illegal_velocity_value
  10764. 1:
  10765.     move.b    d0,(a2)+
  10766.     move.l    d0,d3
  10767.     dbra    d2,mml_z_lp
  10768.     bra    @f
  10769. exit_z_lp:
  10770.     cmpi.b    #velo_max-2,d2
  10771.     bne    @f
  10772.     move.b    tpt_velo(a5),d1    *数値が一個の時は@uと同等
  10773.     bclr.b    #c_vseq,tpt_mode_flg(a5)    *スイッチオフ
  10774.     bra    mml_@u_        *通常のベロシティZMD生成へ
  10775. z_use_default:
  10776.     bsr    skip_sep    *skip ','
  10777.     move.b    #$80,(a2)+    *default velocity code
  10778.     dbra    d2,mml_z_lp
  10779. @@:
  10780.     bsr    chk_num
  10781.     bpl    m_too_many_parameters        *パラメータ多すぎ
  10782.     clr.w    tpt_velo_n(a5)    *init pointer
  10783.     moveq.l    #velo_max-1,d0
  10784.     sub.w    d2,d0
  10785.     move.w    d0,tpt_n_of_velo(a5)
  10786.     bra    mml_lp
  10787.  
  10788. velocity_sequence:            *ベロシティシーケンスの実行
  10789.     btst.b    #c_vseq,tpt_mode_flg(a5)
  10790.     beq    1f
  10791.     btst.b    #c_renp1,tpt_mode_flg(a5)    *連符(PASS1)か
  10792.     bne    1f
  10793.     movem.l    d0-d1/a1,-(sp)
  10794.     move.w    tpt_velo_n(a5),d0
  10795.     cmp.w    tpt_n_of_velo(a5),d0    *maxで戻る
  10796.     bcs    @f
  10797.     move.w    #1,tpt_velo_n(a5)
  10798.     move.b    tpt_velo(a5),d1
  10799.     bra    3f
  10800. @@:
  10801.     addq.w    #1,tpt_velo_n(a5)
  10802.     lea    tpt_velo(a5),a1
  10803.     move.b    (a1,d0.w),d1
  10804. 3:
  10805.     bmi    2f
  10806.     moveq.l    #velocity_zmd,d0
  10807.     bsr    do_wrt_trk_b
  10808.     move.l    d1,d0
  10809.     bsr    do_wrt_trk_b
  10810. 2:
  10811.     movem.l    (sp)+,d0-d1/a1
  10812. 1:
  10813.     rts
  10814.  
  10815. mml_z_chord:                    *和音ベロシティシーケンス
  10816.     * - all
  10817. reglist    reg    d0-d3/a2
  10818.     movem.l    reglist,-(sp)
  10819.     bsr    skip_spc
  10820.     bclr.b    #c_vseq_chd,tpt_mode_flg+1(a5)    *off vseq
  10821.     cmp.l    a4,d4
  10822.     bls    exit_mzc
  10823.     cmpi.b    #',',(a4)
  10824.     beq    @f
  10825.     bsr    chk_num
  10826.     bmi    exit_mzc            *数値が一個もない時はスイッチオフ
  10827. @@:
  10828.     bset.b    #c_vseq_chd,tpt_mode_flg+1(a5)
  10829.     lea    tpt_velo_chd(a5),a2
  10830.     moveq.l    #max_note_on-1,d2
  10831.     moveq.l    #$80,d1
  10832. _mml_z_lp:
  10833.     bsr    skip_spc
  10834.     cmp.l    a4,d4
  10835.     bls    _exit_z_lp
  10836.     cmpi.b    #',',(a4)
  10837.     beq    _z_use_default    *default velocity
  10838.     bsr    chk_num
  10839.     bmi    _exit_z_lp
  10840.     cmpi.b    #'+',(a4)
  10841.     seq    d3
  10842.     beq    @f
  10843.     cmpi.b    #'-',(a4)
  10844.     seq    d3
  10845. @@:
  10846.     bsr    get_num
  10847.     bsr    skip_sep    *skip ','
  10848.     tst.b    d3
  10849.     beq    @f
  10850.                 *相対を考慮
  10851.     add.l    #192,d1        *-63~63を129~255へ
  10852.     cmpi.l    #129,d1
  10853.     bcs    m_illegal_velocity_value
  10854.     cmpi.l    #255,d1
  10855.     bhi    m_illegal_velocity_value
  10856.     bra    1f
  10857. @@:
  10858.     cmpi.l    #127,d1        *127より大きいとエラー
  10859.     bhi    m_illegal_velocity_value
  10860. 1:
  10861.     move.b    d1,(a2)+
  10862.     dbra    d2,_mml_z_lp
  10863.     bra    @f
  10864. _z_use_default:
  10865.     bsr    skip_sep    *skip ','
  10866.     move.b    d1,(a2)+    *default velocity code
  10867.     dbra    d2,_mml_z_lp
  10868. @@:
  10869.     bsr    chk_num
  10870.     bpl    m_too_many_parameters        *パラメータ多すぎ
  10871. _exit_z_lp:
  10872.     clr.w    tpt_velo_n_chd(a5)    *init pointer
  10873.     moveq.l    #max_note_on-1,d0
  10874.     sub.w    d2,d0
  10875.     move.w    d0,tpt_n_of_velo_chd(a5)
  10876. exit_mzc:
  10877.     movem.l    (sp)+,reglist
  10878.  
  10879. velocity_sequence_chord:            *和音ベロシティシーケンスの実行
  10880.     btst.b    #c_vseq_chd,tpt_mode_flg+1(a5)
  10881.     beq    1f
  10882.     btst.b    #c_renp1,tpt_mode_flg(a5)    *連符(PASS1)か
  10883.     bne    1f
  10884.     movem.l    d0-d1/a1,-(sp)
  10885.     move.w    tpt_velo_n_chd(a5),d0
  10886.     cmp.w    tpt_n_of_velo_chd(a5),d0    *maxで戻る
  10887.     bcs    @f
  10888.     move.w    #1,tpt_velo_n_chd(a5)
  10889.     move.b    tpt_velo_chd(a5),d1
  10890.     bra    3f
  10891. @@:
  10892.     addq.w    #1,tpt_velo_n_chd(a5)
  10893.     lea    tpt_velo_chd(a5),a1
  10894.     move.b    (a1,d0.w),d1
  10895. 3:
  10896.     cmpi.b    #$80,d1
  10897.     beq    2f
  10898.     move.b    d1,vl_buf-work(a6)
  10899. 2:
  10900.     movem.l    (sp)+,d0-d1/a1
  10901. 1:
  10902.     rts
  10903.  
  10904. mml_port_:                *ポルタメント #2
  10905.     clr.b    seq_cmd-work(a6)
  10906.     move.w    #']'*256+portament2_zmd,port_bracket-work(a6)
  10907.     bsr    skip_spc
  10908.     cmp.l    a4,d4
  10909.     bls    m_syntax_error    *'['だけで終わっている
  10910.     move.b    (a4),d0
  10911.     bsr    mk_capital
  10912.     cmpi.b    #'A',d0
  10913.     bne    @f
  10914.     move.l    a4,d2
  10915.     addq.w    #1,a4        *skip 'A'
  10916.     bsr    chk_num
  10917.     bpl    4f
  10918.     move.l    d2,-(sp)
  10919.     bsr    get_str_ch    *> d2=type,ch
  10920.     movem.l    (sp)+,d2    *わざとmovem
  10921.     beq    5f
  10922.     bra    2f
  10923. 4:
  10924.     bsr    get_num
  10925. 5:
  10926.     bsr    skip_sep    *skip ','
  10927.     bsr    chk_num
  10928.     bpl    1f
  10929.     bra    2f
  10930. @@:
  10931.     cmpi.b    #'O',d0
  10932.     bne    @f
  10933.     move.l    a4,d2
  10934.     addq.w    #1,a4        *skip 'A'
  10935.     bsr    chk_num
  10936.     bpl    2f
  10937.     bra    1f
  10938. @@:
  10939.     cmpi.b    #'<',d0
  10940.     beq    port_entry
  10941.     cmpi.b    #'>',d0
  10942.     beq    port_entry
  10943.     cmpi.b    #'A',d0
  10944.     bcs    1f
  10945.     cmpi.b    #'G',d0
  10946.     bls    port_entry
  10947. 1:                *common command
  10948.     move.l    d7,a4
  10949.     bra    m_syntax_error    *文法エラー
  10950. 2:                *portament
  10951.     move.l    d2,a4
  10952.     bra    port_entry
  10953.  
  10954. mml_port:            *ポルタメント
  10955.     move.w    #')'*256+portament_zmd,port_bracket-work(a6)
  10956.     bsr    skip_spc
  10957.     cmp.l    a4,d4
  10958.     bls    m_syntax_error    *'('だけで終わっている
  10959.     move.b    (a4),d0
  10960.     bsr    mk_capital
  10961.     cmpi.b    #'O',d0
  10962.     bne    @f
  10963.     move.l    a4,d2
  10964.     addq.w    #1,a4        *skip 'O'
  10965.     bsr    chk_num
  10966.     bmi    1f        *(O)case
  10967.     bsr    get_num        *get dummy number
  10968.     bsr    skip_spc
  10969.     cmp.l    a4,d4
  10970.     bls    1f        *(O)case
  10971.     cmpi.b    #')',(a4)
  10972.     beq    1f        *(O)case
  10973.     bra    2f
  10974. @@:
  10975.     cmpi.b    #'A',d0
  10976.     bne    @f
  10977.     move.l    a4,d2
  10978.     addq.w    #1,a4        *skip 'A'
  10979.     bsr    chk_num
  10980.     bpl    4f
  10981.     move.l    d2,-(sp)
  10982.     bsr    get_str_ch    *> d2=type,ch
  10983.     movem.l    (sp)+,d2    *わざとmovem
  10984.     beq    5f
  10985.     bra    2f
  10986. 4:
  10987.     bsr    get_num
  10988. 5:
  10989.     bsr    skip_sep    *skip ','
  10990.     bsr    chk_num
  10991.     bpl    1f
  10992.     bra    2f
  10993. @@:
  10994.     cmpi.b    #'<',d0
  10995.     beq    port_entry
  10996.     cmpi.b    #'>',d0
  10997.     beq    port_entry
  10998.     cmpi.b    #'A',d0
  10999.     bcs    1f
  11000.     cmpi.b    #'G',d0
  11001.     bls    port_entry
  11002. 1:                *common command
  11003.     move.l    d7,a4
  11004.     bra    mmlc_exit    *共通コマンドとみなしてコンパイルルーチン抜ける
  11005. 2:                *portament
  11006.     move.l    d2,a4
  11007. port_entry:
  11008.     btst.b    #c_break,tpt_mode_flg(a5)    *コンパイル中断フラグチェック
  11009.     bne    go_skip_mml
  11010.     bclr.b    #c_step,tpt_mode_flg(a5)
  11011.     bclr.b    #c_gate,tpt_mode_flg(a5)
  11012.     move.b    #$80,vl_buf-work(a6)
  11013.     bsr    velocity_sequence
  11014.     btst.b    #c_renp1,tpt_mode_flg(a5)
  11015.     beq    @f
  11016.     addq.l    #1,tpt_renp_cnt(a5)    *個数=個数+1
  11017. @@:
  11018.     bsr    skip_spc        *オクターブスイッチの考慮その1
  11019.     cmp.l    a4,d4
  11020.     bls    m_portament_command_error
  11021.     move.b    (a4),d0
  11022.     bsr    oct_chk
  11023.     bmi    @b
  11024.     bsr    get_port_key
  11025.     move.l    d0,d3            *save 1st kc
  11026.     swap    d3
  11027.     bsr    get_port_length        *音長があるならそれを取り出す(>d0)
  11028.                     *オクターブスイッチの考慮その2
  11029.     bsr    skip_sep
  11030. @@:
  11031.     bsr    skip_spc
  11032.     cmp.l    a4,d4
  11033.     bls    m_portament_command_error
  11034.     move.b    (a4),d0
  11035.     bsr    oct_chk
  11036.     bmi    @b
  11037.     bsr    get_port_key
  11038.     move.l    d0,d5            *save 2nd kc
  11039.     swap    d5
  11040.     bsr    get_port_length        *音長があるならそれを取り出す(>d0)
  11041. @@:                    *最後のオクターブスイッチの考慮
  11042.     bsr    skip_spc
  11043.     cmp.l    a4,d4
  11044.     bls    m_portament_command_error
  11045.     move.b    (a4),d0
  11046.     bsr    oct_chk
  11047.     bmi    @b
  11048.     bsr    skip_spc
  11049.     cmp.l    a4,d4
  11050.     bls    m_portament_command_error    *終端の')'がない
  11051.     move.b    port_bracket-work(a6),d0
  11052.     cmp.b    (a4)+,d0
  11053.     bne    m_syntax_error            *終端の')'がない
  11054.     bsr    skip_spc
  11055.     cmp.l    a4,d4
  11056.     bls    do_wrt_port
  11057.     cmpi.b    #'*',(a4)
  11058.     bne    @f
  11059.     addq.w    #1,a4                *skip    '*'
  11060. @@:
  11061.     bsr    chk_num
  11062.     bmi    @f                *音長省略のケース
  11063.     btst.b    #c_renp1,tpt_mode_flg(a5)
  11064.     bne    m_group_notes_command_error    *連符内に音長指定は不可能
  11065.     bsr    get_num
  11066.     cmp.l    #max_note_len,d1
  11067.     bhi    m_illegal_note_length
  11068.     move.w    d1,step_buf-work(a6)
  11069. @@:                    *ディレイがあれば取得
  11070.     bsr    skip_sep
  11071.     cmp.l    a4,d4
  11072.     bls    do_wrt_port
  11073.     cmpi.b    #'*',(a4)
  11074.     bne    @f
  11075.     addq.w    #1,a4            *skip    '*'
  11076. @@:
  11077.     moveq.l    #0,d1
  11078.     move.w    tpt_port_dly(a5),d1
  11079.     bsr    chk_num
  11080.     bmi    @f            *ディレイはない
  11081.     bsr    get_num
  11082. @@:
  11083.     move.w    d1,tpt_port_dly(a5)
  11084.     beq    @f
  11085.     cmpi.l    #-32768,d1
  11086.     blt    m_delay_too_long    *絶対値が16bit範囲より大きいとエラー
  11087.     cmpi.l    #32767,d1
  11088.     bgt    m_delay_too_long    *絶対値が16bit範囲より大きいとエラー
  11089.     bset.l    #23,d3            *delay有りのマーク
  11090.     move.w    d1,d3            *save delay
  11091. @@:                    *ホールドタイムがあれば取得
  11092.     bsr    skip_sep
  11093.     cmp.l    a4,d4
  11094.     bls    do_wrt_port
  11095.     cmpi.b    #'*',(a4)
  11096.     bne    @f
  11097.     addq.w    #1,a4            *skip    '*'
  11098. @@:
  11099.     move.w    tpt_port_hold(a5),d1
  11100.     ext.l    d1
  11101.     bsr    chk_num
  11102.     bmi    @f
  11103.     bsr    get_num
  11104. @@:
  11105.     move.w    d1,tpt_port_hold(a5)
  11106.     beq    do_wrt_port
  11107.     move.l    d1,d0
  11108.     bpl    @f
  11109.     neg.l    d0
  11110.     cmpi.l    #max_note_len,d0
  11111.     bhi    m_hold_time_too_long
  11112.     bra    mmlport00
  11113. @@:
  11114.     cmpi.l    #max_note_len,d0
  11115.     bhi    m_portament_time_too_long
  11116. mmlport00:
  11117.     bset.l    #23,d5            *hold有りのマーク
  11118.     move.w    d1,d5            *save hold
  11119. do_wrt_port:                *ポルタメントコマンドパラメータ・バッファへの書き込み
  11120.     * < d3.l=src kc/delay
  11121.     * < d5.l=dest kc/hold(port.time)
  11122.     move.l    d3,d0
  11123.     swap    d0
  11124.     andi.w    #$7f,d0
  11125.     bsr    scan_prev_notes
  11126.     move.w    step_buf(pc),d2        *get step
  11127.     move.l    arry_stock(pc),a3    *今回の結果をストアするワーク
  11128.     btst.b    #c_renp2,tpt_mode_flg(a5)    *↑連符処理(PASS2)
  11129.     beq    chk_pt_echo
  11130.     move.w    tpt_renp_length(a5),d2
  11131.     tst.w    tpt_renp_surplus(a5)
  11132.     beq    @f
  11133.     addq.w    #1,d2
  11134.     subq.w    #1,tpt_renp_surplus(a5)        *↓連符処理(PASS2)
  11135. @@:
  11136.     move.w    d2,step_buf-work(a6)
  11137. chk_pt_echo:
  11138.     tst.b    tpt_echo_switch(a5)
  11139.     beq    @f
  11140.     cmp.w    tpt_echo_dly(a5),d2    *dly方が大きい場合は処理なし
  11141.     bhi    echo_case_port
  11142. @@:
  11143.     bsr    skip_spc
  11144.     cmp.l    a4,d4
  11145.     bls    @f
  11146.     cmp.b    #'&',(a4)
  11147.     bne    @f
  11148.     addq.w    #1,a4        *タイのケース
  11149.     move.w    #TIE_GATE,d6
  11150.     bra    go_dwp
  11151. @@:                        *ゲートを計算するケース
  11152.     move.w    gate_buf(pc),d0
  11153.     btst.b    #c_gate,tpt_mode_flg(a5)
  11154.     bne    @f                *ゲートはすでに設定済み
  11155.     move.w    step_buf(pc),d0
  11156.     bsr    calc_gt
  11157. @@:
  11158.     bsr    consider_trkfrq_gt        *trkfrqを考慮する
  11159.     move.l    d0,d6
  11160. go_dwp:                    *< d6.w=default gate
  11161.     move.b    port_zmd-work(a6),d0
  11162.     bsr    do_wrt_trk_b
  11163.     move.w    d3,d1
  11164.     bpl    @f
  11165.     add.w    d1,d2            *step+delay
  11166.     bra    1f
  11167. @@:
  11168.     sub.w    d1,d2            *step-delay
  11169. 1:
  11170.     ble    m_delay_too_long
  11171.     tst.w    d5            *port.time(pl)? or hold time(mi)?
  11172.     beq    dwp0
  11173.     bpl    @f
  11174.     add.w    d5,d2            *d2=portament time
  11175.     bgt    dwp0            *tailの方が大きい場合は
  11176.     bra    m_hold_time_too_long    *d5=hold time
  11177. @@:
  11178.     cmp.w    d2,d5
  11179.     bcc    m_portament_time_too_long
  11180.     move.w    d5,d2            *d2=portament time
  11181. dwp0:
  11182.     swap    d3
  11183.     swap    d5
  11184.     move.l    d3,d0            *src note
  11185.     bsr    do_wrt_trk_b
  11186.     andi.w    #$7f,d0
  11187.     move.w    d0,(a3)+
  11188.     move.l    d5,d0            *dest note
  11189.     bsr    do_wrt_trk_b
  11190.     tst.b    d3
  11191.     bpl    1f
  11192.     move.w    d1,d0            *delay
  11193.     bpl    @f
  11194.     move.w    step_buf(pc),d0
  11195.     add.w    d1,d0
  11196. @@:
  11197.     bsr    consider_trkfrq_st    *trkfrqを考慮する
  11198.     bsr    do_wrt_trk_v
  11199. 1:
  11200.     tst.b    d5
  11201.     bpl    @f
  11202.     move.l    d2,d0            *hold
  11203.     bsr    consider_trkfrq_st    *trkfrqを考慮する
  11204.     bsr    do_wrt_trk_v
  11205. @@:
  11206.     move.w    step_buf(pc),d0
  11207.     bsr    consider_trkfrq_st    *trkfrqを考慮する(step)
  11208.     bsr    do_wrt_trk_v        *set step time
  11209.     move.l    d6,d0
  11210.     move.w    d0,(a3)+
  11211.     bmi    @f
  11212.     st.b    -3(a3)            *タイでない通常ノートならばゲート書き換えフェーズは不要
  11213.     bsr    do_wrt_trk_v        *set gate(normal)
  11214.     bra    dwp1
  11215. @@:                    *タイ
  11216.     move.l    tpt_now(a5),(a3)
  11217.     bsr    do_wrt_trk_w
  11218. dwp1:
  11219.     move.l    #-1,4(a3)        *endcode
  11220.     move.b    vl_buf(pc),d0
  11221.     bsr    do_wrt_trk_b        *velocity
  11222.     bsr    rewrite_note_gate
  11223.     bsr    preserve_this_note
  11224.     tst.b    seq_cmd-work(a6)
  11225.     beq    mml_lp
  11226.     rts
  11227.  
  11228. echo_case_port:                *疑似エコー・プリプロセッシング(portament)
  11229.     * < d3.l=src kc/delay
  11230.     * < d5.l=dest kc/hold(port.time)
  11231.     * < d6.w=gate time
  11232.     * < d2.w=step_buf
  11233.     bsr    skip_spc
  11234.     cmp.l    a4,d4
  11235.     bls    @f
  11236.     cmp.b    #'&',(a4)
  11237.     bne    @f
  11238.     addq.w    #1,a4        *タイのケース
  11239.     move.w    #TIE_GATE,d6
  11240.     bra    go_ecp
  11241. @@:                        *ゲートを計算するケース
  11242.     move.w    gate_buf(pc),d0
  11243.     btst.b    #c_gate,tpt_mode_flg(a5)
  11244.     bne    @f                *ゲートはすでに設定済み
  11245.     move.w    d2,d0
  11246.     bsr    calc_gt
  11247. @@:
  11248.     bsr    consider_trkfrq_gt        *trkfrqを考慮する
  11249.     move.l    d0,d6
  11250. go_ecp:                    *< d6.w=default gate
  11251.     move.l    d4,-(sp)
  11252.     move.w    tpt_echo_loop(a5),d7
  11253.     subq.w    #1,d7            *for dbra
  11254.     moveq.l    #0,d1
  11255.     move.b    vl_buf(pc),d1
  11256.     cmpi.b    #$80,d1
  11257.     bne    @f
  11258.     move.w    #192,d1            *buetral:192//tpt_last_velo(a5),d5    *直前のVelocity適用
  11259. @@:
  11260.     move.b    tpt_echo_vdec(a5),d4    *減衰量
  11261.     ext.w    d4
  11262. echopelp_prt:                *ベロシティが絶対値あるいは相対値指定の場合
  11263. reglist    reg    d2-d5/d7/a2-a3
  11264.     movem.l    reglist,-(sp)
  11265.     tst.w    d6            *check gate
  11266.     beq    2f            *no more gate
  11267.     tst.w    d7            *last
  11268.     beq    1f
  11269.     move.w    tpt_echo_dly(a5),a2
  11270.     cmp.w    a2,d2
  11271.     bcc    @f
  11272. 1:
  11273.     move.l    d2,a2
  11274. @@:
  11275.     move.l    a2,d2
  11276.     move.l    d3,a1
  11277.     tst.w    d3
  11278.     bpl    @f
  11279.     add.w    a1,a2            *step+delay
  11280.     bra    1f
  11281. @@:
  11282.     sub.w    a1,a2            *step-delay
  11283. 1:
  11284.     ble    m_delay_too_long
  11285.     tst.w    d5            *hold time/port time
  11286.     beq    echo_dwp0
  11287.     bpl    @f
  11288.     add.w    d5,a2            *a2=port time
  11289.     bgt    echo_dwp0
  11290.     bra    m_hold_time_too_long    *d5=hold time
  11291. @@:
  11292.     cmp.w    a2,d5
  11293.     bcc    m_portament_time_too_long
  11294.     move.w    d5,a2
  11295. echo_dwp0:
  11296.     move.b    port_zmd-work(a6),d0
  11297.     bra    @f
  11298. 2:
  11299.     moveq.l    #wait_zmd,d0
  11300. @@:
  11301.     bsr    do_wrt_trk_b
  11302.     tst.w    d6            *case:gate=0
  11303.     beq    1f
  11304.     swap    d3
  11305.     swap    d5
  11306.     move.l    d3,d0
  11307.     bsr    do_wrt_trk_b        *src note
  11308.     andi.w    #$7f,d0
  11309.     move.w    d0,(a3)+
  11310.     move.l    d5,d0
  11311.     bsr    do_wrt_trk_b        *dest. note
  11312.     tst.b    d3
  11313.     bpl    @f
  11314.     move.l    a1,d0            *delay
  11315.     bsr    consider_trkfrq_st
  11316.     bsr    do_wrt_trk_w
  11317. @@:
  11318.     tst.b    d5
  11319.     bpl    1f
  11320.     move.l    a2,d0
  11321.     bsr    consider_trkfrq_st
  11322.     bsr    do_wrt_trk_v        *hold
  11323. 1:
  11324.     move.l    d2,d0
  11325.     bsr    consider_trkfrq_st
  11326.     bsr    do_wrt_trk_v        *step
  11327.     move.w    tpt_echo_dly(a5),d0
  11328.     tst.w    d6
  11329.     beq    echope_next_prt        *gate=0ならば以下の処理はいらない
  11330.     bpl    @f
  11331.     tst.w    d7
  11332.     bne    2f
  11333.     move.w    #TIE_GATE,d0
  11334.     bra    2f
  11335. @@:
  11336.     tst.w    d7
  11337.     bne    1f
  11338.     move.w    d6,d0
  11339.     bra    2f
  11340. 1:
  11341.     sub.w    d0,d6
  11342. 2:
  11343.     move.w    d0,(a3)+        *gate
  11344.     bmi    @f
  11345.     st.b    -3(a3)
  11346.     bsr    do_wrt_trk_v        *gate
  11347.     bra    echo_dwp1
  11348. @@:
  11349.     move.l    tpt_now(a5),(a3)
  11350.     bsr    do_wrt_trk_w
  11351. echo_dwp1:
  11352.     move.l    #-1,4(a3)        *endcode
  11353.     move.b    d1,d0
  11354.     bsr    do_wrt_trk_b        *velocity
  11355.     tst.b    d1
  11356.     bpl    ech_absvlo_prt
  11357.     add.w    d4,d1            *減衰処理
  11358.     cmpi.w    #129,d1
  11359.     bcc    @f
  11360.     move.w    #129,d1
  11361.     bra    echope_next_prt
  11362. @@:
  11363.     cmpi.w    #255,d1
  11364.     bls    echope_next_prt
  11365.     move.w    #255,d1
  11366.     bra    echope_next_prt
  11367. ech_absvlo_prt:                *ベロシティが絶対値指定の場合
  11368.     add.w    d4,d1            *減衰処理
  11369.     bpl    @f
  11370.     moveq.l    #0,d1
  11371.     bra    echope_next_prt
  11372. @@:
  11373.     cmp.w    #127,d1
  11374.     bls    echope_next_prt
  11375.     moveq.l    #127,d1
  11376. echope_next_prt:
  11377.     movem.l    (sp)+,reglist
  11378.     sub.w    tpt_echo_dly(a5),d2
  11379.     bls    @f
  11380.     dbra    d7,echopelp_prt
  11381.     tst.w    tpt_echo_loop(a5)    *無限ループケース
  11382.     beq    echopelp_prt
  11383. *    moveq.l    #wait_zmd,d0
  11384. *    bsr    do_wrt_trk_b
  11385. *    move.w    d2,d0
  11386. *    bsr    do_wrt_trk_v
  11387. @@:
  11388.     bsr    rewrite_note_gate
  11389.     bsr    preserve_this_note    *今回の発音内容を保存
  11390.     move.l    (sp)+,d4
  11391.     bra    mml_lp
  11392.  
  11393. *case_step_shortage_prt:
  11394. *    * < d2.w=step
  11395. *    moveq.l    #wait_zmd,d0
  11396. *    bsr    do_wrt_trk_b
  11397. *    move.l    d2,d0
  11398. *    bsr    do_wrt_trk_v
  11399. *    movem.l    (sp)+,reglist
  11400. *    bra    @b
  11401.  
  11402. mml_pull_portament:        *ポルタメント[PULL_PORTAMENT...]
  11403.     move.b    #portament2_zmd,port_zmd-work(a6)
  11404.     bra    @f
  11405.  
  11406. mml_push_portament:        *ポルタメント[PUSH_PORTAMENT...]
  11407. mml_portament:            *ポルタメント[PORTAMENT...]
  11408.     move.b    #portament_zmd,port_zmd-work(a6)
  11409. @@:
  11410.     bclr.b    #c_step,tpt_mode_flg(a5)
  11411.     bclr.b    #c_gate,tpt_mode_flg(a5)
  11412.     move.b    #$80,vl_buf-work(a6)
  11413.     bsr    velocity_sequence
  11414.     btst.b    #c_renp1,tpt_mode_flg(a5)
  11415.     beq    @f
  11416.     addq.l    #1,tpt_renp_cnt(a5)    *個数=個数+1
  11417. @@:
  11418.     bsr    skip_spc        *オクターブスイッチの考慮その1
  11419.     cmp.l    a4,d4
  11420.     bls    m_portament_command_error
  11421.     move.b    (a4),d0
  11422.     bsr    oct_chk
  11423.     bmi    @b
  11424.     bsr    get_port_key
  11425.     move.l    d0,d3            *save 1st kc
  11426.     swap    d3
  11427. @@:                    *オクターブスイッチの考慮その2
  11428.     bsr    skip_sep
  11429.     cmp.l    a4,d4
  11430.     bls    m_portament_command_error
  11431.     move.b    (a4),d0
  11432.     bsr    oct_chk
  11433.     bmi    @b
  11434.     bsr    get_port_key
  11435.     move.l    d0,d5                *save 2nd kc
  11436.     swap    d5
  11437. @@:                        *最後のオクターブスイッチの考慮
  11438.     bsr    skip_spc
  11439.     cmp.l    a4,d4
  11440.     bls    m_portament_command_error
  11441.     move.b    (a4),d0
  11442.     bsr    oct_chk
  11443.     bmi    @b
  11444.     bsr    skip_sep
  11445.     bsr    get_abs_length            *音長があるならそれを取り出す(>d0)
  11446.                         *ディレイがあれば取得
  11447.     bsr    skip_sep
  11448.     bsr    chk_num
  11449.     bmi    @f                *ディレイはない
  11450.     bsr    get_num
  11451.     cmpi.l    #-32768,d1
  11452.     blt    m_delay_too_long        *絶対値が16bit範囲より大きいとエラー
  11453.     cmpi.l    #32767,d1
  11454.     bgt    m_delay_too_long        *絶対値が16bit範囲より大きいとエラー
  11455.     bset.l    #23,d3                *delay有りのマーク
  11456.     move.w    d1,d3                *save delay
  11457. @@:                        *ホールドタイムがあれば取得
  11458.     bsr    skip_sep
  11459.     bsr    chk_num
  11460.     bmi    do_wrt_port            *holdはない
  11461.     bsr    get_num
  11462.     move.l    d1,d0
  11463.     bpl    @f
  11464.     neg.l    d0
  11465.     cmpi.l    #max_note_len,d0
  11466.     bhi    m_hold_time_too_long
  11467.     bra    1f
  11468. @@:
  11469.     cmpi.l    #max_note_len,d0
  11470.     bhi    m_portament_time_too_long
  11471. 1:
  11472.     bset.l    #23,d5                *hold有りのマーク
  11473.     move.w    d1,d5                *save hold
  11474.     bra    do_wrt_port
  11475.  
  11476. get_port_key:
  11477.     * > d0.b=kc
  11478.     bsr    skip_sep
  11479.     cmp.l    a4,d4
  11480.     bls    m_syntax_error
  11481.     move.b    (a4)+,d0
  11482.     bsr    mk_capital
  11483.     sub.b    #'A',d0
  11484.     cmpi.b    #6,d0
  11485.     bhi    m_illegal_note_number
  11486.     moveq.l    #0,d1
  11487.     move.b    d0,d1
  11488.     bsr    get_key        *キーコードを得る
  11489.     cmpi.b    #127,d0
  11490.     bhi    m_illegal_note_number
  11491. exit_gpk:
  11492.     rts
  11493.  
  11494. oct_chk:
  11495.     * < d0.b='O' '<' '>' or others
  11496.     * > mi=again
  11497.     * > eq=no more check
  11498.     bsr    mk_capital
  11499.     cmpi.b    #'O',d0
  11500.     bne    @f
  11501.     addq.w    #1,a4        *skip 'O'
  11502.     bsr    chk_num
  11503.     bmi    m_illegal_octave
  11504.     bsr    get_num
  11505.     addq.l    #1,d1        *d1=0~10
  11506.     cmpi.l    #10,d1
  11507.     bhi    m_illegal_octave
  11508.     move.b    d1,tpt_octave(a5)
  11509.     bra    oct_chk_again
  11510. @@:
  11511.     cmp.b    #OCTAVE_UP,d0
  11512.     bne    @f
  11513.     addq.w    #1,a4        *skip '<'
  11514.     bsr    do_oup
  11515.     bra    oct_chk_again
  11516. @@:
  11517.     cmp.b    #OCTAVE_DOWN,d0
  11518.     bne    @f
  11519.     addq.w    #1,a4        *skip '>'
  11520.     bsr    do_odwn
  11521.     bra    oct_chk_again
  11522. @@:
  11523.     moveq.l    #0,d0
  11524.     rts
  11525. oct_chk_again:
  11526.     moveq.l    #-1,d0
  11527.     rts
  11528.  
  11529. do_oup:                *オクターブアップ
  11530.     cmpi.b    #10,tpt_octave(a5)
  11531.     beq    m_illegal_octave    *illegal octave
  11532.     addq.b    #1,tpt_octave(a5)
  11533.     rts
  11534.  
  11535. do_odwn:            *オクターブダウン
  11536.     tst.b    tpt_octave(a5)
  11537.     beq    m_illegal_octave    *illegal octave
  11538.     subq.b    #1,tpt_octave(a5)
  11539.     rts
  11540.  
  11541. get_abs_length:                    *ステップ、ゲート、ベロシティ取得
  11542.     * > d0.w=step time
  11543. reglist    reg    d1-d3/a2
  11544.     movem.l    reglist,-(sp)
  11545.     bsr    skip_spc
  11546.     cmp.l    a4,d4
  11547.     bls    m_illegal_parameter_format
  11548.     bsr    chk_oncho
  11549.     bpl    2f
  11550.     cmpi.b    #'.',(a4)
  11551.     bne    1f
  11552.     bset.b    #c_step,tpt_mode_flg(a5)    *符点がある場合は音長指定があったのと同等扱い
  11553. 1:
  11554.     move.w    tpt_note_len(a5),d0    *get default length
  11555.     bra    3f            *デフォルトステップタイムを得て符点処理へ
  11556. 2:
  11557.     btst.b    #c_renp1,tpt_mode_flg(a5)    *連符内に音長指定は出来ない
  11558.     bne    m_group_notes_command_error
  11559.     bsr    get_num                *絶対音長指定
  11560.     move.l    d1,d0
  11561.     bset.b    #c_step,tpt_mode_flg(a5)    *mark
  11562. 3:
  11563.     bsr    futen_ope            *< d0.w=step source
  11564.     cmp.l    #max_note_len,d1        *最大値チェック
  11565.     bhi    m_illegal_note_length
  11566.     move.w    d1,step_buf-work(a6)
  11567.     bclr.b    #c_gate,tpt_mode_flg(a5)    *以前のゲートタイム無効化
  11568.                         *ゲートタイムが有れば取得
  11569.     bsr    skip_sep
  11570.     cmp.l    a4,d4
  11571.     bls    m_illegal_parameter_format
  11572.     bsr    chk_oncho
  11573.     bmi    @f
  11574.     bsr    get_num
  11575.     move.l    d1,d0
  11576.     bsr    futen_ope            *符点を考慮(< d0.l)
  11577.     move.w    d1,gate_buf-work(a6)
  11578.     bset.b    #c_gate,tpt_mode_flg(a5)    *flag on
  11579. @@:
  11580.     bsr    skip_sep            *ベロシティがあればゲット
  11581.     cmp.l    a4,d4
  11582.     bls    m_illegal_parameter_format
  11583.     bsr    chk_num
  11584.     bmi    2f
  11585.                         *ベロシティー
  11586.     move.b    (a4),d0
  11587.     cmpi.b    #'-',d0                *相対チェック
  11588.     beq    @f
  11589.     cmpi.b    #'+',d0
  11590.     bne    1f        *直値指定
  11591. @@:                *相対指定
  11592.     bsr    get_num
  11593.     add.l    #192,d1        *-63~63を129~255へ
  11594.     cmpi.l    #129,d1
  11595.     bcs    m_illegal_velocity_value
  11596.     cmpi.l    #255,d1
  11597.     bhi    m_illegal_velocity_value
  11598.     bra    @f
  11599. 1:
  11600.     bsr    get_num
  11601.     cmpi.l    #127,d1
  11602.     bhi    m_illegal_velocity_value
  11603. @@:
  11604.     move.b    d1,vl_buf-work(a6)
  11605. 2:
  11606.     movem.l    (sp)+,reglist
  11607.     rts
  11608.  
  11609. mml_mute:                *[MUTE]
  11610.     moveq.l    #kill_note_zmd,d0
  11611.     bsr    do_wrt_trk_b
  11612.     moveq.l    #1,d0            *完全消音
  11613.     bra    do_wrt_trk_b
  11614.  
  11615. mml_stop:                *[STOP]
  11616.     moveq.l    #kill_note_zmd,d0
  11617.     bsr    do_wrt_trk_b
  11618.     bsr    skip_sep2
  11619.     cmp.l    a4,d4
  11620.     bls    m_illegal_command_line    *']'がない
  11621.     cmpi.b    #']',(a4)
  11622.     bne    @f
  11623.     moveq.l    #2,d0            *完全消音して演奏終了(default)
  11624.     bra    do_wrt_trk_b
  11625. @@:
  11626.     lea    mmlstop_mode-work(a6),a1
  11627.     bsr    get_com_no
  11628.     bmi    m_illegal_mode_value    *規定外
  11629.     moveq.l    #-1,d0            *完全消音して演奏終了
  11630.     bra    do_wrt_trk_b
  11631.  
  11632. mml_all_sound_off:        *[ALL_SOUND_OFF]
  11633. mml_kill_note:            *強制キーオフコマンド
  11634.     moveq.l    #kill_note_zmd,d0
  11635.     bsr    do_wrt_trk_b
  11636.     moveq.l    #0,d0        *通常消音
  11637.     bsr    do_wrt_trk_b
  11638.     tst.b    seq_cmd-work(a6)
  11639.     beq    mml_lp
  11640.     rts
  11641.  
  11642. mml_chord:                    *和音コマンド
  11643.     btst.b    #c_renp1,tpt_mode_flg(a5)
  11644.     beq    @f
  11645.     addq.l    #1,tpt_renp_cnt(a5)        *個数=個数+1
  11646. @@:
  11647.     moveq.l    #0,d6                *note cnt
  11648.     bclr.b    #c_step,tpt_mode_flg(a5)
  11649.     move.b    #$80,vl_buf-work(a6)
  11650.     bsr    velocity_sequence
  11651.     move.b    vl_buf(pc),d5            *d5.b=velocity
  11652.     move.b    tpt_octave(a5),oct_wk-work(a6)    *一時保存
  11653.     move.l    temp_buffer(pc),a1        *一時的に和音の構成音をここへ格納
  11654.     clr.w    tpt_velo_n_chd(a5)        *和音ベロシティシーケンスポインタの初期化
  11655. get_chord_lp:                    *note(.b),velocity(.b),gate(.w)
  11656.     bclr.b    #c_gate,tpt_mode_flg(a5)
  11657.     move.b    d5,vl_buf-work(a6)
  11658.     bsr    velocity_sequence_chord
  11659.     bsr    skip_spc
  11660.     cmp.l    a4,d4
  11661.     bls    m_chord_command_error        *"'"が見つからないで和音が終わった
  11662.     move.b    (a4),d0
  11663.     cmpi.b    #"'",d0
  11664.     beq    exit_gwk            *終端コード発見
  11665.     bsr    mk_capital
  11666.     cmpi.b    #'Z',d0
  11667.     bne    @f
  11668.     addq.w    #1,a4                *skip 'Z'
  11669.     bsr    mml_z_chord            *和音ベロシティシーケンス
  11670. @@:
  11671.     bsr    oct_chk                *オクターブがあれば取得
  11672.     bmi    get_chord_lp
  11673.     bsr    get_port_key
  11674.     move.b    d0,(a1)+            *note number
  11675.     bsr    get_chord_length        *数値があるならそれを音長に
  11676.     moveq.l    #-1,d0                *ゲートタイムは無指定の場合:-1
  11677.     btst.b    #c_gate,tpt_mode_flg(a5)
  11678.     beq    @f
  11679.     move.w    gate_buf(pc),d0
  11680. @@:
  11681.     move.b    vl_buf(pc),(a1)+        *velocity
  11682.     move.w    d0,(a1)+            *gate time(無指定の場合は-1)
  11683. @@:
  11684.     bsr    skip_spc
  11685.     cmp.l    a4,d4
  11686.     bls    m_chord_command_error        *"'"が見つからないで和音が終わった
  11687.     move.b    (a4),d0
  11688.     bsr    oct_chk                *オクターブがあれば取得
  11689.     bmi    @b
  11690.     addq.w    #1,d6
  11691.     cmpi.w    #max_note_on,d6
  11692.     bhi    m_too_many_notes        *音符が多すぎる
  11693.     cmpi.b    #"'",(a4)            *終端コード発見?
  11694.     bne    get_chord_lp            *ループする
  11695. exit_gwk:
  11696.     addq.w    #1,a4                *skip "'"
  11697.     tst.w    d6
  11698.     beq    m_chord_command_error        *音符が一個もない
  11699.     bsr    skip_spc
  11700.     cmp.l    a4,d4
  11701.     bls    calc_chord_gt
  11702.     cmpi.b    #'*',(a4)
  11703.     bne    @f
  11704.     addq.w    #1,a4                *skip    '*'
  11705. @@:
  11706.     bsr    chk_num
  11707.     bmi    @f
  11708.     btst.b    #c_renp1,tpt_mode_flg(a5)
  11709.     bne    m_group_notes_command_error    *連符内に音長指定は不可能
  11710.     bsr    get_num                *音長取りだし
  11711.     cmp.l    #max_note_len,d1
  11712.     bhi    m_illegal_note_length
  11713.     move.w    d1,step_buf-work(a6)
  11714. @@:
  11715.     bsr    skip_sep
  11716.     cmp.l    a4,d4
  11717.     bls    calc_chord_gt
  11718.     cmpi.b    #'*',(a4)
  11719.     bne    @f
  11720.     addq.w    #1,a4            *skip    '*'
  11721. @@:
  11722.     bsr    chk_num
  11723.     bpl    @f
  11724.     move.w    tpt_chord_dly(a5),d1    *prev.delay
  11725.     ext.l    d1
  11726.     bra    1f
  11727. @@:
  11728.     bsr    get_num            *delay取りだし
  11729. 1:
  11730.     tst.l    d1
  11731.     bpl    1f
  11732.     move.l    arry_stock(pc),a3
  11733.     move.l    d6,d2
  11734.     subq.w    #1,d2            *for dbra
  11735. @@:
  11736.     move.l    -(a1),(a3)+
  11737.     dbra    d2,@b
  11738.     move.l    temp_buffer(pc),a1
  11739.     move.l    arry_stock(pc),a3
  11740.     move.l    d6,d2
  11741.     subq.w    #1,d2            *for dbra
  11742. @@:
  11743.     move.l    (a3)+,(a1)+
  11744.     dbra    d2,@b
  11745.     move.w    d1,tpt_chord_dly(a5)    *new delay
  11746.     neg.l    d1            *delayが負の場合は和音構成を逆に
  11747.     bra    2f
  11748. 1:
  11749.     move.w    d1,tpt_chord_dly(a5)    *new delay
  11750. 2:
  11751.     cmpi.l    #max_note_len,d1
  11752.     bhi    m_delay_too_long
  11753. calc_chord_gt:                *ゲートタイムの計算
  11754.     btst.b    #c_renp2,tpt_mode_flg(a5)    *↑連符処理(PASS2)
  11755.     beq    chk_cd_echo
  11756.     move.w    tpt_renp_length(a5),d0
  11757.     tst.w    tpt_renp_surplus(a5)
  11758.     beq    @f
  11759.     addq.w    #1,d0
  11760.     subq.w    #1,tpt_renp_surplus(a5)        *↓連符処理(PASS2)
  11761. @@:
  11762.     move.w    d0,step_buf-work(a6)
  11763. chk_cd_echo:
  11764.     move.l    temp_buffer(pc),a1    *今回の発音
  11765.     move.l    arry_stock(pc),a3    *今回の結果をストアするワーク
  11766.     moveq.l    #0,d3            *蓄積step time work
  11767.     move.l    d6,d2
  11768.     subq.w    #1,d2            *for dbra
  11769.     bsr    skip_spc
  11770.     cmp.l    a4,d4
  11771.     bls    reset_chord_gt
  11772.     cmp.b    #'&',(a4)
  11773.     bne    reset_chord_gt
  11774.     addq.w    #1,a4
  11775.     tst.b    tpt_echo_switch(a5)
  11776.     beq    @f
  11777.     move.w    step_buf(pc),d6
  11778.     cmp.w    tpt_echo_dly(a5),d6    *dly方が大きい場合は処理なし
  11779.     bhi    echo_case_chord0
  11780. @@:
  11781.     move.w    step_buf(pc),d0
  11782.     bsr    calc_gt_chd
  11783.     move.l    d0,d5            *d5=calclated default gate time
  11784. do_wrt_chd_lp0:                *以下タイのケース
  11785.     moveq.l    #0,d0
  11786.     move.b    (a1)+,d0
  11787.     move.w    d0,(a3)+        *tnb_note
  11788.     bsr    scan_prev_notes
  11789.     bsr    do_wrt_trk_b        *note
  11790.     move.b    (a1)+,d1        *velo
  11791.     tst.w    d2            *ラストか
  11792.     bne    @f            *no
  11793.                     *yes:最後のステップタイムは特別
  11794.     move.w    step_buf(pc),d0        *step time work
  11795.     sub.w    d3,d0
  11796.     bls    m_delay_too_long    *delayが大きすぎるために最後のstep timeが0になった
  11797.     bra    wrchgt00
  11798. @@:                    *ラストじゃないケース
  11799.     move.w    tpt_chord_dly(a5),d0
  11800.     bpl    @f
  11801.     neg.w    d0
  11802. @@:
  11803. wrchgt00:                *ゲートタイムはこの時点では0
  11804.     bsr    consider_trkfrq_st    *trkfrqを考慮する(step)
  11805.     bsr    do_wrt_trk_v        *step time
  11806.     move.w    (a1)+,d0        *get gate
  11807.     cmp.w    #-1,d0            *gate=-1は算出したゲートタイムを使用するケース
  11808.     bne    @f
  11809.     move.l    d5,d0
  11810.     bra    next_wrchgt00
  11811. @@:
  11812.     sub.w    d3,d0
  11813.     bls    m_delay_too_long    *delayが大きすぎる
  11814. next_wrchgt00:
  11815.     bsr    consider_trkfrq_gt    *trkfrqを考慮する
  11816.     move.w    d0,(a3)+        *gate time
  11817.     move.l    tpt_now(a5),(a3)+
  11818.     move.l    #-1,(a3)
  11819.     move.w    #CHORD_TIE_GATE,d0
  11820.     bsr    do_wrt_trk_w
  11821.     move.b    d1,d0
  11822.     bsr    do_wrt_trk_b        *velocity
  11823.     move.w    tpt_chord_dly(a5),d0
  11824.     bpl    @f
  11825.     neg.w    d0
  11826. @@:
  11827.     add.w    d0,d3
  11828.     bmi    m_delay_too_long
  11829.     dbra    d2,do_wrt_chd_lp0
  11830.     bsr    rewrite_note_gate    *ゲートを書き換える
  11831.     bsr    preserve_this_note    *今回の発音内容を保存
  11832.     bra    exit_mml_chord
  11833.  
  11834. reset_chord_gt:                *ゲートを計算するケース
  11835.     tst.b    tpt_echo_switch(a5)
  11836.     beq    @f
  11837.     move.w    step_buf(pc),d6
  11838.     cmp.w    tpt_echo_dly(a5),d6    *dly方が大きい場合は処理なし
  11839.     bhi    echo_case_chord1
  11840. @@:
  11841.     move.w    step_buf(pc),d0
  11842.     bsr    calc_gt_chd
  11843.     move.l    d0,d5            *d5=calclated default gate time
  11844. do_wrt_chd_lp1:
  11845.     moveq.l    #0,d0
  11846.     move.b    (a1)+,d0
  11847.     bsr    scan_prev_notes
  11848.     bsr    do_wrt_trk_b    *note
  11849.     move.b    (a1)+,d1    *velo
  11850.     tst.w    d2
  11851.     bne    @f
  11852.                     *最後のステップタイムは特別
  11853.     move.w    step_buf(pc),d0        *step time work
  11854.     sub.w    d3,d0
  11855.     bls    m_delay_too_long    *delayが大きすぎるために最後のstep timeが0になった
  11856.     bra    wrchgt01
  11857. @@:
  11858.     move.w    tpt_chord_dly(a5),d0
  11859.     bpl    @f
  11860.     neg.w    d0
  11861. @@:
  11862. wrchgt01:
  11863.     bsr    consider_trkfrq_st    *trkfrqを考慮する(step)
  11864.     bsr    do_wrt_trk_v
  11865.     move.w    (a1)+,d0
  11866.     cmp.w    #-1,d0            *gate=-1は算出したゲートタイムを使用するケース
  11867.     bne    @f
  11868.     move.l    d5,d0
  11869.     bra    wrchgt02
  11870. @@:
  11871.     sub.w    d3,d0
  11872.     bls    m_delay_too_long    *delayが大きすぎる
  11873. wrchgt02:
  11874.     bsr    consider_trkfrq_gt    *trkfrqを考慮する
  11875.     bsr    do_wrt_trk_v        *gate time
  11876.     move.b    d1,d0
  11877.     bsr    do_wrt_trk_b        *velocity
  11878.     move.w    tpt_chord_dly(a5),d0
  11879.     bpl    @f
  11880.     neg.w    d0
  11881. @@:
  11882.     tst.w    d2
  11883.     beq    @f
  11884.     add.w    d0,d3
  11885.     bmi    m_delay_too_long
  11886.     sub.w    d0,d5
  11887.     bls    m_delay_too_long
  11888.     dbra    d2,do_wrt_chd_lp1
  11889. @@:
  11890.     btst.b    #c_renp1,tpt_mode_flg(a5)
  11891.     bne    exit_mml_chord
  11892.     bsr    rewrite_note_gate    *ゲートを書き換える
  11893.     move.l    #-1,tpt_note_buf(a5)    *off
  11894. exit_mml_chord:
  11895.     move.b    oct_wk(pc),tpt_octave(a5)
  11896.     bra    mml_lp
  11897.  
  11898. echo_case_chord0:            *擬似エコー・プリプロセッシング和音編(tie)
  11899.     * < d2.w=和音数
  11900.     * < d6.w=step_buf
  11901.     * < a1.l=和音テーブル
  11902.     move.w    tpt_echo_loop(a5),d7
  11903.     subq.w    #1,d7            *for dbra
  11904.     move.w    tpt_echo_dly(a5),d3    *step time work
  11905. echopelp0_cd0:
  11906. reglist    reg    d2-d3/d6-d7/a1-a3
  11907.     movem.l    reglist,-(sp)
  11908.     move.b    tpt_echo_vdec(a5),d0
  11909.     ext.w    d0
  11910.     move.w    d0,a2
  11911. echopelp1_cd0:                *<d6.w=step
  11912.     moveq.l    #0,d0
  11913.     move.b    (a1)+,d0
  11914.     move.w    d0,(a3)+        *tnb_note
  11915.     bsr    scan_prev_notes
  11916.     bsr    do_wrt_trk_b        *note
  11917.     moveq.l    #0,d1
  11918.     move.b    (a1),d1            *velo
  11919.     bpl    ech_absvlo_cd0
  11920.     move.l    d1,d0
  11921.     cmpi.b    #$80,d0
  11922.     bne    @f
  11923.     move.w    #192,d0            *neutral
  11924.     move.w    #192,d1            *neutral
  11925. @@:
  11926.     add.w    a2,d0
  11927.     cmpi.w    #129,d0
  11928.     bcc    @f
  11929.     moveq    #129,d0
  11930.     bra    echope_next_cd0
  11931. @@:
  11932.     cmpi.w    #255,d0
  11933.     bls    echope_next_cd0
  11934.     moveq.l    #255,d0
  11935.     bra    echope_next_cd0
  11936. ech_absvlo_cd0:
  11937.     move.l    d1,d0
  11938.     add.w    a2,d0
  11939.     bpl    @f
  11940.     moveq.l    #0,d0
  11941.     bra    echope_next_cd0
  11942. @@:
  11943.     cmpi.w    #127,d0
  11944.     bls    echope_next_cd0
  11945.     moveq.l    #127,d0
  11946. echope_next_cd0:
  11947.     move.b    d0,(a1)+        *次回のベロシティ
  11948.     move.w    tpt_chord_dly(a5),d0
  11949.     bpl    @f
  11950.     neg.w    d0
  11951. @@:
  11952.     tst.w    d2
  11953.     bne    @f
  11954.     move.w    d3,d0            *和音構成音の中でラスト
  11955.     tst.w    d7            *最後の最後の音か
  11956.     beq    1f
  11957.     cmp.w    d0,d6
  11958.     bcc    @f
  11959. 1:
  11960.     move.w    d6,d0
  11961. @@:                    *ゲートタイムはこの時点では0
  11962.     bsr    consider_trkfrq_st    *trkfrqを考慮する(step)
  11963.     bsr    do_wrt_trk_v        *step time
  11964.  
  11965.     move.w    d3,d0            *ゲートタイム
  11966.     tst.w    d7            *最後の最後の音か
  11967.     beq    1f
  11968.     cmp.w    d0,d6
  11969.     bcc    @f
  11970. 1:
  11971.     move.w    d6,d0
  11972. @@:
  11973.     move.w    d0,-(sp)
  11974.     move.w    tpt_chord_dly(a5),d0
  11975.     bpl    @f
  11976.     neg.w    d0
  11977. @@:
  11978.     sub.w    d0,d6
  11979.     sub.w    d0,d3
  11980.     bls    m_delay_too_long
  11981.     move.w    (sp)+,d0
  11982.     move.w    d0,(a1)+
  11983.     bsr    consider_trkfrq_gt    *trkfrqを考慮する
  11984.     move.w    d0,(a3)+        *gate time
  11985.     move.l    tpt_now(a5),(a3)+    *tnb_offset
  11986.     move.l    #-1,(a3)        *endcode
  11987.     tst.w    d7            *
  11988.     bne    @f            *
  11989.     move.w    #CHORD_TIE_GATE,d0    *最後
  11990. @@:                    *
  11991.     bsr    do_wrt_trk_v
  11992.     move.b    d1,d0
  11993.     bsr    do_wrt_trk_b        *velocity
  11994.     dbra    d2,echopelp1_cd0
  11995.     movem.l    (sp)+,reglist
  11996.     sub.w    tpt_echo_dly(a5),d6
  11997.     bls    @f
  11998.     dbra    d7,echopelp0_cd0
  11999.     tst.w    tpt_echo_loop(a5)
  12000.     beq    echopelp0_cd0
  12001. @@:
  12002.     bsr    rewrite_note_gate    *ゲートを書き換える
  12003.     bsr    preserve_this_note    *今回の発音内容を保存
  12004.     bra    exit_mml_chord
  12005.  
  12006. echo_case_chord1:            *擬似エコー・プリプロセッシング和音編(not tie)
  12007.     * < d2.w=和音数
  12008.     * < d6.w=step_buf
  12009.     * < a1.l=和音テーブル
  12010.     move.w    d6,d0
  12011.     bsr    calc_gt_chd
  12012.     move.l    d0,d5            *d5=calclated default gate time
  12013.     move.w    tpt_echo_loop(a5),d7
  12014.     subq.w    #1,d7            *for dbra
  12015.     move.w    tpt_echo_dly(a5),d3    *step time work
  12016. echopelp0_cd1:
  12017. reglist    reg    d2-d3/d5-d7/a1-a3
  12018.     movem.l    reglist,-(sp)
  12019.     move.b    tpt_echo_vdec(a5),d0
  12020.     ext.w    d0
  12021.     move.w    d0,a2
  12022. echopelp1_cd1:
  12023.     moveq.l    #0,d0
  12024.     move.b    (a1)+,d0
  12025.     bsr    scan_prev_notes
  12026.     bsr    do_wrt_trk_b        *note
  12027.     moveq.l    #0,d1
  12028.     move.b    (a1),d1            *velo
  12029.     bpl    ech_absvlo_cd1
  12030.     move.l    d1,d0
  12031.     cmpi.b    #$80,d0
  12032.     bne    @f
  12033.     move.w    #192,d0            *neutral
  12034.     move.w    #192,d1            *neutral
  12035. @@:
  12036.     add.w    a2,d0
  12037.     cmpi.w    #129,d0
  12038.     bcc    @f
  12039.     moveq    #129,d0
  12040.     bra    echope_next_cd1
  12041. @@:
  12042.     cmpi.w    #255,d0
  12043.     bls    echope_next_cd1
  12044.     moveq.l    #255,d0
  12045.     bra    echope_next_cd1
  12046. ech_absvlo_cd1:
  12047.     move.l    d1,d0
  12048.     add.w    a2,d0
  12049.     bpl    @f
  12050.     moveq.l    #0,d0
  12051.     bra    echope_next_cd1
  12052. @@:
  12053.     cmpi.w    #127,d0
  12054.     bls    echope_next_cd1
  12055.     moveq.l    #127,d0
  12056. echope_next_cd1:
  12057.     move.b    d0,(a1)+        *次回のベロシティ
  12058.     move.w    tpt_chord_dly(a5),d0
  12059.     bpl    @f
  12060.     neg.w    d0
  12061. @@:
  12062.     tst.w    d2
  12063.     bne    @f
  12064.     move.w    d3,d0
  12065.     tst.w    d7
  12066.     beq    1f
  12067.     cmp.w    d0,d6
  12068.     bcc    @f
  12069. 1:
  12070.     move.w    d6,d0
  12071. @@:
  12072.     bsr    consider_trkfrq_st    *trkfrqを考慮する(step)
  12073.     bsr    do_wrt_trk_v        *step time
  12074.  
  12075.     move.w    (a1)+,d0        *get gate
  12076.     cmp.w    #-1,d0            *gate=-1は算出したゲートタイムを使用するケース
  12077.     bne    @f
  12078.     tst.w    d7
  12079.     beq    1f
  12080.     move.w    d3,d0
  12081.     cmp.w    d0,d5
  12082.     bcc    2f
  12083. 1:
  12084.     move.w    d5,d0
  12085.     bra    2f
  12086. @@:                    *指定されたゲートタイムを使うケース
  12087.     cmp.w    tpt_echo_dly(a5),d0
  12088.     bcs    @f
  12089.     sub.w    tpt_echo_dly(a5),d0
  12090.     move.w    d0,-2(a1)        *次回のゲートタイム
  12091.     move.w    tpt_echo_dly(a5),d0
  12092.     bra    2f
  12093. @@:
  12094.     clr.w    -2(a1)            *gate=0:end
  12095. 2:
  12096.     move.w    d0,-(sp)
  12097.     move.w    tpt_chord_dly(a5),d0
  12098.     bpl    @f
  12099.     neg.w    d0
  12100. @@:
  12101.     sub.w    d0,d5
  12102.     sub.w    d0,d6
  12103.     sub.w    d0,d3
  12104.     bls    m_delay_too_long
  12105.     move.w    (sp)+,d0
  12106.     bsr    consider_trkfrq_gt    *trkfrqを考慮する
  12107.     bsr    do_wrt_trk_v        *gate time
  12108.     move.b    d1,d0
  12109.     bsr    do_wrt_trk_b        *velocity
  12110.     dbra    d2,echopelp1_cd1
  12111.     movem.l    (sp)+,reglist
  12112.     sub.w    tpt_echo_dly(a5),d5    *最後のときだけ引く
  12113.     bhi    @f
  12114.     moveq.l    #0,d5
  12115. @@:
  12116.     sub.w    tpt_echo_dly(a5),d6
  12117.     bls    @f
  12118.     dbra    d7,echopelp0_cd1
  12119.     tst.w    tpt_echo_loop(a5)
  12120.     beq    echopelp0_cd1
  12121. @@:
  12122.     btst.b    #c_renp1,tpt_mode_flg(a5)
  12123.     bne    exit_mml_chord
  12124.     bsr    rewrite_note_gate    *ゲートを書き換える
  12125.     move.l    #-1,tpt_note_buf(a5)    *off
  12126.     bra    exit_mml_chord
  12127.  
  12128. scan_prev_notes:            *前回のノート(タイ/スラー)の音と
  12129.     * < d0.b=note            *今回発音する音がダブルか
  12130.     * - all
  12131.     btst.b    #c_renp1,tpt_mode_flg(a5)
  12132.     bne    exit_spn0
  12133.     movem.l    d1/a2,-(sp)
  12134.     lea    tpt_note_buf(a5),a2
  12135. @@:
  12136.     move.b    tnb_note(a2),d1
  12137.     bmi    exit_spn        *endcode case
  12138.     tst.b    d0            *!休符やウェイトなどは特別扱い
  12139.     bmi    1f            *!
  12140.     cmp.b    d1,d0
  12141.     bne    next_spn
  12142. 1:
  12143.     st.b    (a2)            *発見! flag on
  12144. next_spn:
  12145.     addq.w    #8,a2
  12146.     bra    @b
  12147. exit_spn:
  12148.     movem.l    (sp)+,d1/a2
  12149. exit_spn0:
  12150.     rts
  12151.  
  12152. preserve_this_note:            *今回発音した音を保存
  12153.     btst.b    #c_renp1,tpt_mode_flg(a5)
  12154.     bne    exit_ptn0
  12155.     movem.l    a2-a3,-(sp)
  12156.     lea    tpt_note_buf(a5),a2    *dest
  12157.     move.l    arry_stock(pc),a3    *src
  12158. @@:
  12159.     tst.b    tnb_note(a3)
  12160.     bmi    @f
  12161.     move.l    (a3)+,(a2)+
  12162.     move.l    (a3)+,(a2)+
  12163.     bra    @b
  12164. @@:
  12165.     move.l    #-1,(a2)+
  12166.     movem.l    (sp)+,a2-a3
  12167. exit_ptn0:
  12168.     rts
  12169.  
  12170. rewrite_note_gate:            *ゲートを書き換える
  12171.     btst.b    #c_renp1,tpt_mode_flg(a5)
  12172.     bne    exit_rng0
  12173.     movem.l    a1-a2,-(sp)
  12174.     lea    tpt_note_buf(a5),a2
  12175. @@:
  12176.     tst.b    tnb_note(a2)
  12177.     bmi    @f
  12178.     tst.b    (a2)            *フラグがONならノートがだぶっているということ
  12179.     bne    next_rng
  12180.     move.l    tnb_offset(a2),a1
  12181.     add.l    tpt_addr(a5),a1
  12182.     move.b    tnb_gate+0(a2),(a1)    *ワードゲートタイムセット
  12183.     tas.b    (a1)+            *最上位ビット=1(ワードマーク)
  12184.     move.b    tnb_gate+1(a2),(a1)    *ワードゲートタイムセット
  12185. next_rng:
  12186.     addq.w    #8,a2
  12187.     bra    @b
  12188. @@:
  12189.     movem.l    (sp)+,a1-a2
  12190. exit_rng0:
  12191.     rts
  12192.  
  12193. get_ag_length:
  12194. get_port_length:
  12195. get_chord_length:            *音符の後ろに音長のあるケース
  12196.     * > d0.w=step time
  12197. reglist    reg    d1-d3/a2
  12198.     movem.l    reglist,-(sp)
  12199.     bsr    skip_spc
  12200.     cmp.l    a4,d4
  12201.     bls    get_def_l        *音長省略のケース(デフォルトの取得)
  12202.     cmp.b    #'*',(a4)
  12203.     bne    1f
  12204.                     *絶対音長指定
  12205.     addq.w    #1,a4            *skip '*'
  12206.     bsr    chk_oncho
  12207.     bmi    m_syntax_error        *数値がない
  12208.     btst.b    #c_renp1,tpt_mode_flg(a5)    *連符内に音長指定は出来ない
  12209.     bne    m_group_notes_command_error
  12210.     bsr    get_num            *絶対音長指定
  12211.     move.l    d1,d0
  12212.     bra    2f
  12213. get_def_l:
  12214.     bsr    skip_spc
  12215.     cmp.l    a4,d4
  12216.     bls    @f
  12217.     cmpi.b    #'.',(a4)
  12218.     bne    @f
  12219. gdl0:
  12220.     bset.b    #c_step,tpt_mode_flg(a5)    *符点がある場合は音長指定があったのと同等扱い
  12221.     move.w    tpt_note_len(a5),d0        *get default length
  12222.     bra    3f                *デフォルトステップタイムを得て符点処理へ
  12223. @@:
  12224.     cmpi.b    #'^',(a4)            *97/08/17
  12225.     beq    gdl0                *97/08/17
  12226.     btst.b    #c_step,tpt_mode_flg(a5)
  12227.     bne    4f                *ゲートタイムの取得へ
  12228.     move.w    tpt_note_len(a5),d0        *get default length
  12229.     bra    3f                *デフォルトステップタイムを得て符点処理へ
  12230. 1:
  12231.     bsr    chk_oncho
  12232.     bmi    get_def_l            *音長省略のケース(デフォルトの取得)
  12233.     btst.b    #c_renp1,tpt_mode_flg(a5)    *連符内に音長指定は出来ない
  12234.     bne    m_group_notes_command_error
  12235.     bsr    get_length        *音楽音長
  12236. 2:
  12237.     bset.b    #c_step,tpt_mode_flg(a5)    *mark
  12238. 3:
  12239.     bsr    futen_ope        *< d0.w=step source
  12240.     cmp.l    #max_note_len,d1    *最大値チェック
  12241.     bhi    m_illegal_note_length
  12242.     move.w    d1,step_buf-work(a6)
  12243.     bclr.b    #c_gate,tpt_mode_flg(a5)    *以前のゲートタイム無効化
  12244. 4:                        *ゲートタイムが有れば取得
  12245.     bsr    skip_sep
  12246.     cmp.l    a4,d4
  12247.     bls    sv_wl
  12248.     bsr    chk_oncho
  12249.     bpl    1f
  12250.     cmp.b    #'*',(a4)        *直接音長指定?
  12251.     bne    mmlag_velo?
  12252.     addq.w    #1,a4            *skip '*'
  12253.     bsr    chk_oncho
  12254.     bmi    m_syntax_error        *数値がない
  12255.     bsr    get_num
  12256.     move.l    d1,d0
  12257.     bra    2f
  12258. 1:
  12259.     bsr    get_length
  12260. 2:
  12261.     bsr    futen_ope        *符点を考慮(< d0.l)
  12262.     move.w    d1,gate_buf-work(a6)
  12263.     bset.b    #c_gate,tpt_mode_flg(a5)    *flag on
  12264. mmlag_velo?:
  12265.     bsr    skip_sep        *ベロシティがあればゲット
  12266.     cmp.l    a4,d4
  12267.     bls    sv_wl
  12268.     bsr    chk_num
  12269.     bmi    sv_wl
  12270.                     *ベロシティー
  12271.     move.b    (a4),d0
  12272.     cmpi.b    #'-',d0            *相対チェック
  12273.     beq    @f
  12274.     cmpi.b    #'+',d0
  12275.     bne    exc_velo_dn    *直値指定
  12276. @@:                *相対指定
  12277.     bsr    get_num
  12278.     add.l    #192,d1        *-63~63を129~255へ
  12279.     cmpi.l    #129,d1
  12280.     bcs    m_illegal_velocity_value
  12281.     cmpi.l    #255,d1
  12282.     bhi    m_illegal_velocity_value
  12283.     bra    @f
  12284. exc_velo_dn:
  12285.     bsr    get_num
  12286.     cmpi.l    #127,d1
  12287.     bhi    m_illegal_velocity_value
  12288. @@:
  12289.     move.b    d1,vl_buf-work(a6)
  12290. sv_wl:
  12291.     movem.l    (sp)+,reglist
  12292.     rts
  12293.  
  12294. mml_@j:                    *MIDIのスペシャル・タイ・モードの設定
  12295.     bsr    chk_num
  12296.     bpl    @f
  12297.     moveq.l    #0,d1
  12298.     bra    mst0
  12299. @@:
  12300.     bsr    get_num
  12301.     cmpi.l    #1,d1
  12302.     bhi    m_illegal_tie_mode    *タイモード値が異常です
  12303. mst0:
  12304.     moveq.l    #tie_mode_zmd,d0
  12305.     bsr    do_wrt_trk_b
  12306.     bsr    wrt_data_d1
  12307.     bra    mml_lp
  12308.  
  12309. mml_tie_mode:                *[TIE_MODE]
  12310.     bsr    chk_num
  12311.     bpl    @f
  12312.     lea    tiemd_tbl(pc),a1
  12313.     bsr    get_com_no        *>d0=0:normal,1:special,2:enhanced
  12314.     bmi    m_illegal_tie_mode    *タイモード値が異常です
  12315.     move.l    d0,d1
  12316.     cmpi.b    #2,d1
  12317.     bcs    _mst0
  12318.     moveq.l    #1,d1            *ENHANCEDはSPECIALと同値に
  12319.     bra    _mst0
  12320. @@:
  12321.     bsr    get_num
  12322.     cmpi.l    #1,d1
  12323.     bhi    m_illegal_tie_mode    *タイモード値が異常です
  12324. _mst0:
  12325.     moveq.l    #tie_mode_zmd,d0
  12326.     bsr    do_wrt_trk_b
  12327.     bra    wrt_data_d1
  12328.  
  12329. mml_switch:                    *=n(特殊コマンドのオンオフスイッチ)
  12330.     bsr    chk_num
  12331.     bpl    get_sw
  12332.     moveq.l    #0,d1
  12333.     bra    chk_sw_n
  12334. get_sw:
  12335.     bsr    get_num
  12336.     cmpi.l    #255,d1
  12337.     bhi    m_illegal_switch_value
  12338. chk_sw_n:
  12339.     bclr.b    #c_vseq,tpt_mode_flg(a5)    *ベロシティシーケンス・アクティヴ・スイッチ初期化
  12340.     btst.l    #sw_vseq,d1
  12341.     beq    @f
  12342.     bset.b    #c_vseq,tpt_mode_flg(a5)    *ベロシティシーケンス・アクティヴ・スイッチ設定
  12343. @@:
  12344.     moveq.l    #0,d2                *アフタータッチ・シーケンス・スイッチ
  12345.     btst.l    #sw_aftc,d1
  12346.     beq    @f
  12347.     moveq.l    #previous_on,d2
  12348. @@:
  12349.     moveq.l    #aftc_sw_zmd,d0
  12350.     bsr    do_wrt_trk_b
  12351.     move.l    d2,d0
  12352.     bsr    do_wrt_trk_b
  12353.  
  12354.     moveq.l    #0,d2                *オートベンドスイッチ
  12355.     btst.l    #sw_bend,d1
  12356.     beq    @f
  12357.     moveq.l    #previous_on,d2
  12358. @@:
  12359.     moveq.l    #bend_sw_zmd,d0
  12360.     bsr    do_wrt_trk_b
  12361.     move.l    d2,d0
  12362.     bsr    do_wrt_trk_b
  12363.  
  12364.     moveq.l    #0,d2                *ARCC-0スイッチ
  12365.     btst.l    #sw_arcc0,d1
  12366.     beq    @f
  12367.     moveq.l    #previous_on,d2
  12368. @@:
  12369.     moveq.l    #arcc_sw_zmd,d0
  12370.     bsr    do_wrt_trk_b
  12371.     moveq.l    #0,d0                *arcc no.
  12372.     bsr    do_wrt_trk_b
  12373.     move.l    d2,d0
  12374.     bsr    do_wrt_trk_b
  12375.  
  12376.     moveq.l    #0,d2                *PMODスイッチ
  12377.     btst.l    #sw_pmod,d1
  12378.     beq    @f
  12379.     moveq.l    #previous_on,d2
  12380. @@:
  12381.     moveq.l    #pmod_sw_zmd,d0
  12382.     bsr    do_wrt_trk_b
  12383.     move.l    d2,d0
  12384.     bsr    do_wrt_trk_b
  12385.     bra    mml_lp
  12386.  
  12387. mml_agogik_depth:            *[AGOGIK.DEPTH]
  12388.     moveq.l    #agogik8_zmd,d0
  12389.     bra    @f
  12390.  
  12391. mml_vibrato_depth:            *[VIBRATO.DEPTH]
  12392.     moveq.l    #pmod8_zmd,d0
  12393. @@:
  12394.     bsr    do_wrt_trk_b
  12395.     bsr    skip_spc
  12396.     cmp.l    a4,d4
  12397.     bls    m_parameter_cannot_be_omitted
  12398.     cmpi.b    #',',(a4)
  12399.     beq    1f
  12400.     lea    switch_strv2(pc),a1
  12401.     bsr    get_com_no
  12402.     bmi    1f
  12403.     subq.b    #1,d0            *-1,0,1,2
  12404.     beq    mvd_off            *OFF
  12405.     bra    @f
  12406. 1:
  12407.     moveq.l    #0,d0            *no touch
  12408. @@:
  12409.     move.l    tpt_now(a5),d5        *あとでomtを格納するため
  12410.     bsr    do_wrt_trk_b        *mode
  12411.     moveq.l    #0,d0
  12412.     bsr    do_wrt_trk_b        *dummy omt
  12413.     bsr    skip_sep
  12414.     bsr    get_@m_prm
  12415.     bsr    chk_num
  12416.     bpl    m_too_many_parameters    *パラメータ多すぎ
  12417.     move.l    tpt_addr(a5),a1
  12418.     add.l    d5,a1
  12419.     cmpi.w    #1,d6            *パラメータが複数あるか
  12420.     bcs    1f
  12421.     bne    @f
  12422.     move.b    #1,(a1)            *1つのときは強制的にoptional mode
  12423. @@:
  12424.     move.b    d6,1(a1)        *set omt
  12425. 1:
  12426.     rts
  12427.  
  12428. mvd_off:
  12429.     moveq.l    #0,d0            *mode=0,omt=0 → OFF
  12430.     bra    do_wrt_trk_w
  12431.  
  12432. mml_@m:                *ピッチモジュレーション @M
  12433.     moveq.l    #pmod8_zmd,d0
  12434.     bsr    do_wrt_trk_b
  12435.     move.l    tpt_now(a5),d5    *あとでmode/omtを格納するため
  12436.     moveq.l    #0,d0
  12437.     bsr    do_wrt_trk_w    *2bytes確保(mode=0,omt=0)
  12438.     bsr    get_@m_prm
  12439.     bsr    chk_num
  12440.     bpl    m_too_many_parameters    *パラメータ多すぎ
  12441.     move.l    tpt_addr(a5),a1
  12442.     add.l    d5,a1
  12443.     move.w    d6,d0
  12444.     beq    @f
  12445.     moveq.l    #1,d0            *optional mode
  12446.     cmpi.w    #1,d6            *パラメータが複数あるか
  12447.     bcs    mml_lp
  12448.     beq    @f
  12449.     moveq.l    #-1,d0            *1/8 mode(複数の場合)
  12450. @@:
  12451.     move.b    d0,(a1)+        *mode
  12452.     move.b    d6,(a1)+        *set omt
  12453.     bra    mml_lp
  12454.  
  12455. get_@m_prm:
  12456.     * > d6.b=omt
  12457.     moveq.l    #0,d6        *omt
  12458.     bsr    skip_spc
  12459.     cmp.l    a4,d4
  12460.     bls    exit_g@mp
  12461.     cmpi.b    #',',(a4)
  12462.     beq    @f
  12463.     bsr    chk_num
  12464.     bmi    exit_g@mp    *@mだけの場合はmode=0,omt=0でスイッチオフ
  12465. @@:
  12466.     moveq.l    #0,d2        *loop counter
  12467.     moveq.l    #0,d3        *previous value
  12468. mml_pmod_lp01:
  12469.     moveq.l    #0,d1
  12470.     bsr    chk_num
  12471.     bpl    @f
  12472.     cmp.l    a4,d4
  12473.     bls    exit_g@mp
  12474.     cmpi.b    #',',(a4)
  12475.     bne    exit_g@mp
  12476.     bsr    skip_sep    *skip ','
  12477.     bra    next_g@mp
  12478. @@:                *振幅パラメータ有り
  12479.     move.b    (a4),d0
  12480.     cmpi.b    #'+',d0
  12481.     beq    rltv_pmod_depth
  12482.     cmpi.b    #'-',d0
  12483.     bne    @f
  12484. rltv_pmod_depth:            *相対指定ケース
  12485.     bsr    get_num
  12486.     add.l    d3,d1
  12487.     bra    chk_pmsz
  12488. @@:
  12489.     bsr    get_num
  12490. chk_pmsz:
  12491.     cmpi.l    #-32768,d1
  12492.     blt    m_illegal_depth_value    *値が16bit範囲より大きいとエラー
  12493.     cmpi.l    #32767,d1
  12494.     bgt    m_illegal_depth_value    *値が16bit範囲より大きいとエラー
  12495.     bsr    skip_sep        *skip ','
  12496.     * < d1.l=modulation value
  12497.     bset.l    d2,d6        *set omt
  12498.     move.l    d1,d0
  12499.     bsr    do_wrt_trk_w    *振幅書き込み
  12500.     move.l    d1,d3        *save d1 into d3
  12501. next_g@mp:
  12502.     bsr    chk_num
  12503.     bpl    @f
  12504.     cmp.l    a4,d4
  12505.     bls    exit_g@mp
  12506.     cmpi.b    #',',(a4)    *まだパラメータがあるか
  12507.     bne    exit_g@mp
  12508. @@:
  12509.     addq.w    #1,d2
  12510.     cmpi.w    #modu_max,d2
  12511.     bcs    mml_pmod_lp01
  12512. exit_g@mp:
  12513.     rts
  12514.  
  12515. mml_agogik_delay:            *[AGOGIK.DELAY]
  12516.     moveq.l    #agogik_delay8_zmd,d0
  12517.     bsr    do_wrt_trk_b
  12518.     bra    @f
  12519.  
  12520. mml_velocity_delay:            *[VELOCITY.DELAY]
  12521.     moveq.l    #vseq_delay8_zmd,d0
  12522.     bsr    do_wrt_trk_b
  12523. @@:
  12524.     move.l    tpt_now(a5),d5        *あとでomtを格納するため
  12525.     moveq.l    #0,d0                *omt
  12526.     bsr    do_wrt_trk_w
  12527.     moveq.l    #1,d6            *0-65535
  12528.     bsr    get_@h_prm
  12529.     bsr    chk_num
  12530.     bpl    m_too_many_parameters    *パラメータ多すぎ
  12531.     cmpi.w    #1,d6            *パラメータが複数あるか
  12532.     bcs    m_parameter_cannot_be_omitted
  12533.     move.l    tpt_addr(a5),a1
  12534.     add.l    d5,a1
  12535.     ror.w    #8,d6
  12536.     move.b    d6,(a1)+
  12537.     ror.w    #8,d6
  12538.     move.b    d6,(a1)+
  12539.     rts
  12540.  
  12541. mml_arcc4_delay:            *[ARCC4.DELAY]
  12542.     moveq.l    #6,d1
  12543.     bra    @f
  12544. mml_arcc3_delay:            *[ARCC3.DELAY]
  12545.     moveq.l    #4,d1
  12546.     bra    @f
  12547. mml_arcc2_delay:            *[ARCC2.DELAY]
  12548.     moveq.l    #2,d1
  12549.     bra    @f
  12550. mml_arcc1_delay:            *[ARCC1.DELAY]
  12551.     moveq.l    #0,d1
  12552. @@:
  12553.     moveq.l    #arcc_delay8_zmd,d0
  12554.     bsr    do_wrt_trk_b
  12555.     move.l    d1,d0            *arcc no.
  12556.     bsr    do_wrt_trk_b
  12557.     bra    @f
  12558.  
  12559. mml_aftertouch_delay:            *[AFTERTOUCH.DELAY]
  12560.     moveq.l    #aftc_delay8_zmd,d0
  12561.     bsr    do_wrt_trk_b
  12562.     bra    @f
  12563.  
  12564. mml_vibrato_delay:            *[VIBRATO.DELAY]
  12565.     moveq.l    #pmod_delay8_zmd,d0
  12566.     bsr    do_wrt_trk_b
  12567. @@:
  12568.     move.l    tpt_now(a5),d5        *あとでomtを格納するため
  12569.     moveq.l    #0,d0            *omt
  12570.     bsr    do_wrt_trk_w
  12571.     moveq.l    #0,d6            *-32768~32767
  12572.     bsr    get_@h_prm
  12573.     bsr    chk_num
  12574.     bpl    m_too_many_parameters    *パラメータ多すぎ
  12575.     cmpi.w    #1,d6            *パラメータが複数あるか
  12576.     bcs    m_parameter_cannot_be_omitted
  12577.     move.l    tpt_addr(a5),a1
  12578.     add.l    d5,a1
  12579.     ror.w    #8,d6
  12580.     move.b    d6,(a1)+
  12581.     ror.w    #8,d6
  12582.     move.b    d6,(a1)+
  12583.     rts
  12584.  
  12585. get_@h_prm:            *ディレイパラメータとりだし
  12586.     * < d6.l=effective range 0:-32768~32767,1:0~65535
  12587.     * > d6.b=omt
  12588.     * - all
  12589. reglist    reg    d1-d3/d7
  12590.     movem.l    reglist,-(sp)
  12591.     move.l    d6,d7
  12592.     moveq.l    #0,d6        *omt
  12593.     bsr    skip_spc
  12594.     cmp.l    a4,d4
  12595.     bls    exit_g@hp
  12596.     cmpi.b    #',',(a4)
  12597.     beq    @f
  12598.     bsr    chk_num
  12599.     bmi    m_parameter_cannot_be_omitted
  12600. @@:
  12601.     moveq.l    #0,d2        *loop counter
  12602.     moveq.l    #0,d3        *previous value
  12603. mml_gt@h_lp01:
  12604.     moveq.l    #0,d1
  12605.     bsr    chk_num
  12606.     bpl    @f
  12607.     cmp.l    a4,d4
  12608.     bls    exit_g@hp
  12609.     cmpi.b    #',',(a4)
  12610.     bne    exit_g@hp
  12611.     bsr    skip_sep    *skip ','
  12612.     bra    next_g@hp
  12613. @@:                *パラメータ有り
  12614.     move.b    (a4),d0
  12615.     cmpi.b    #'+',d0
  12616.     beq    rltv_delay
  12617.     cmpi.b    #'-',d0
  12618.     bne    @f
  12619. rltv_delay:            *相対指定ケース
  12620.     bsr    get_num
  12621.     add.l    d3,d1
  12622.     bra    chk_dlysz
  12623. @@:
  12624.     bsr    get_num
  12625. chk_dlysz:
  12626.     tst.l    d2
  12627.     beq    @f
  12628.     tst.l    d1            *0が設定できるのは最初のディレイだけ
  12629.     beq    m_illegal_delay
  12630.     bra    1f            *最初以外は1-65535とする
  12631. @@:
  12632.     tst.l    d7            *check RANGE flag
  12633.     beq    @f
  12634. 1:
  12635.     cmpi.l    #max_note_len,d1    *0-65535
  12636.     bhi    m_delay_too_long    *絶対値が16bit範囲より大きいとエラー
  12637.     bra    1f
  12638. @@:                    *-32768~32767
  12639.     cmpi.l    #-32768,d1
  12640.     blt    m_delay_too_long    *絶対値が16bit範囲より大きいとエラー
  12641.     cmpi.l    #32767,d1
  12642.     bgt    m_delay_too_long    *絶対値が16bit範囲より大きいとエラー
  12643. 1:
  12644.     bsr    skip_sep        *skip ','
  12645.     bset.l    d2,d6            *set omt
  12646.     move.l    d1,d3            *save d1 into d3
  12647.     move.l    d1,d0
  12648.     bsr    consider_trkfrq_st    *trkfrqを考慮する
  12649.     bsr    do_wrt_trk_w        *ディレイ値書き込み
  12650. next_g@hp:
  12651.     bsr    chk_num
  12652.     bpl    @f
  12653.     cmp.l    a4,d4
  12654.     bls    exit_g@hp
  12655.     cmpi.b    #',',(a4)    *まだパラメータがあるか
  12656.     bne    exit_g@hp
  12657. @@:
  12658.     addq.w    #1,d2
  12659.     cmpi.w    #modu_max+1,d2    *最初のディレイ+8個のディレイ=9個のディレイが書ける
  12660.     bcs    mml_gt@h_lp01
  12661. exit_g@hp:
  12662.     movem.l    (sp)+,reglist
  12663.     rts
  12664.  
  12665. mml_@h:                        *モジュレーションディレイ
  12666.     bsr    skip_spc
  12667.     cmp.l    a4,d4
  12668.     bls    m_parameter_cannot_be_omitted    *パラメータ両方省略はエラー
  12669.     cmpi.b    #',',(a4)
  12670.     beq    @f                *最初のパラメータが省略
  12671.     bsr    chk_num
  12672.     bmi    m_parameter_cannot_be_omitted    *数字がない
  12673.     bsr    get_num
  12674.     cmpi.l    #-32768,d1
  12675.     blt    m_delay_too_long        *絶対値が16bit範囲より大きいとエラー
  12676.     cmpi.l    #32767,d1
  12677.     bgt    m_delay_too_long        *絶対値が16bit範囲より大きいとエラー
  12678.     moveq.l    #pmod_delay8_zmd,d0
  12679.     bsr    do_wrt_trk_b
  12680.     moveq.l    #1,d0                *omt
  12681.     bsr    do_wrt_trk_w
  12682.     move.l    d1,d0                *delay value
  12683.     bsr    consider_trkfrq_st        *trkfrqを考慮する
  12684.     bsr    do_wrt_trk_w
  12685. @@:
  12686.     bsr    skip_sep            *skip ','
  12687.     bsr    chk_num
  12688.     bmi    mml_lp                *数字がないので省略と見なす
  12689.     bsr    get_num
  12690.     cmpi.l    #-32768,d1
  12691.     blt    m_delay_too_long        *絶対値が16bit範囲より大きいとエラー
  12692.     cmpi.l    #32767,d1
  12693.     bgt    m_delay_too_long        *絶対値が16bit範囲より大きいとエラー
  12694.     moveq.l    #arcc_delay8_zmd,d0
  12695.     bsr    do_wrt_trk_b
  12696.     moveq.l    #0,d0                *arcc no.=0
  12697.     bsr    do_wrt_trk_b
  12698.     moveq.l    #1,d0                *omt
  12699.     bsr    do_wrt_trk_w
  12700.     move.l    d1,d0                *delay value
  12701.     bsr    consider_trkfrq_st        *trkfrqを考慮する
  12702.     bsr    do_wrt_trk_w
  12703.     bra    mml_lp
  12704.  
  12705. mml_arcc4_speed:            *[ARCC4.SPEED]
  12706.     moveq.l    #6,d1
  12707.     bra    @f
  12708. mml_arcc3_speed:            *[ARCC3.SPEED]
  12709.     moveq.l    #4,d1
  12710.     bra    @f
  12711. mml_arcc2_speed:            *[ARCC2.SPEED]
  12712.     moveq.l    #2,d1
  12713.     bra    @f
  12714. mml_arcc1_speed:            *[ARCC1.SPEED]
  12715.     moveq.l    #0,d1
  12716. @@:
  12717.     moveq.l    #arcc_speed8_zmd,d0
  12718.     bsr    do_wrt_trk_b
  12719.     move.l    d1,d0
  12720.     bsr    do_wrt_trk_b        *arcc no.
  12721.     bra    @f
  12722.  
  12723. mml_agogik_speed:                *[AGOGIK.SPEED]
  12724.     moveq.l    #agogik_speed8_zmd,d0
  12725.     bsr    do_wrt_trk_b
  12726.     bra    @f
  12727.  
  12728. mml_velocity_speed:                *[VELOCITY.SPEED]
  12729.     moveq.l    #vseq_speed8_zmd,d0
  12730.     bsr    do_wrt_trk_b
  12731.     bra    @f
  12732.  
  12733. mml_vibrato_speed:                *[VIBRATO.SPEED]
  12734.     moveq.l    #pmod_speed8_zmd,d0
  12735.     bsr    do_wrt_trk_b
  12736. @@:
  12737.     move.l    tpt_now(a5),d5        *あとでomtを格納するため
  12738.     moveq.l    #0,d0                *omt
  12739.     bsr    do_wrt_trk_b
  12740.     bsr    get_@s_prm
  12741.     bsr    chk_num
  12742.     bpl    m_too_many_parameters    *パラメータ多すぎ
  12743.     cmpi.w    #1,d6            *パラメータが複数あるか
  12744.     bcs    m_parameter_cannot_be_omitted
  12745.     move.l    tpt_addr(a5),a1
  12746.     move.b    d6,(a1,d5.l)        *set omt
  12747.     rts
  12748.  
  12749. get_@s_prm:            *スピードパラメータとりだし
  12750.     * > d6.b=omt
  12751.     moveq.l    #0,d6        *omt
  12752.     bsr    skip_spc
  12753.     cmp.l    a4,d4
  12754.     bls    exit_g@sp
  12755.     cmpi.b    #',',(a4)
  12756.     beq    @f
  12757.     bsr    chk_num
  12758.     bmi    m_parameter_cannot_be_omitted
  12759. @@:
  12760.     moveq.l    #0,d2        *loop counter
  12761.     moveq.l    #0,d3        *previous value
  12762. mml_gt@s_lp01:
  12763.     moveq.l    #0,d1
  12764.     bsr    chk_num
  12765.     bpl    @f
  12766.     cmp.l    a4,d4
  12767.     bls    exit_g@sp
  12768.     cmpi.b    #',',(a4)
  12769.     bne    exit_g@sp
  12770.     bsr    skip_sep    *skip ','
  12771.     bra    next_g@sp
  12772. @@:                *振幅パラメータ有り
  12773.     move.b    (a4),d0
  12774.     cmpi.b    #'+',d0
  12775.     beq    rltv_speed
  12776.     cmpi.b    #'-',d0
  12777.     bne    @f
  12778. rltv_speed:        *相対指定ケース
  12779.     bsr    get_num
  12780.     add.l    d3,d1
  12781.     bra    chk_spdsz
  12782. @@:
  12783.     bsr    get_num
  12784. chk_spdsz:
  12785.     tst.l    d1
  12786.     beq    m_illegal_speed_value
  12787.     cmpi.l    #spd_max,d1
  12788.     bhi    m_speed_too_slow    *絶対値が16bit範囲より大きいとエラー
  12789.     bsr    skip_sep        *skip ','
  12790.     bset.l    d2,d6            *set omt
  12791.     move.l    d1,d3            *save d1 into d3
  12792.     move.l    d1,d0
  12793.     add.w    d0,d0            *2倍
  12794.     bsr    consider_trkfrq_st    *trkfrqを考慮する
  12795.     bsr    do_wrt_trk_w        *スピード値
  12796. next_g@sp:
  12797.     bsr    chk_num
  12798.     bpl    @f
  12799.     cmp.l    a4,d4
  12800.     bls    exit_g@sp
  12801.     cmpi.b    #',',(a4)    *まだパラメータがあるか
  12802.     bne    exit_g@sp
  12803. @@:
  12804.     addq.w    #1,d2
  12805.     cmpi.w    #modu_max,d2
  12806.     bcs    mml_gt@s_lp01
  12807. exit_g@sp:
  12808.     rts
  12809.  
  12810. mml_@s:                        *モジュレーションスピード
  12811.     bsr    skip_spc
  12812.     cmp.l    a4,d4
  12813.     bls    m_parameter_cannot_be_omitted    *パラメータ両方省略はエラー
  12814.     cmpi.b    #',',(a4)
  12815.     beq    @f                *最初のパラメータが省略
  12816.     bsr    chk_num
  12817.     bmi    m_parameter_cannot_be_omitted    *数字がない
  12818.     bsr    get_num
  12819.     cmpi.l    #spd_max,d1
  12820.     bhi    m_speed_too_slow        *規定外
  12821.     add.w    d1,d1                *2倍
  12822.     beq    m_illegal_speed_value        *規定外
  12823.     moveq.l    #pmod_speed8_zmd,d0
  12824.     bsr    do_wrt_trk_b
  12825.     moveq.l    #1,d0                *omt
  12826.     bsr    do_wrt_trk_b
  12827.     move.l    d1,d0                *speed value
  12828.     bsr    consider_trkfrq_st        *trkfrqを考慮する
  12829.     bsr    do_wrt_trk_w
  12830. @@:
  12831.     bsr    skip_sep            *skip ','
  12832.     bsr    chk_num
  12833.     bmi    mml_lp                *数字がないので省略と見なす
  12834.     bsr    get_num
  12835.     cmpi.l    #spd_max,d1
  12836.     bhi    m_speed_too_slow        *規定外
  12837.     add.w    d1,d1
  12838.     beq    m_illegal_speed_value        *2倍
  12839.     moveq.l    #arcc_speed8_zmd,d0
  12840.     bsr    do_wrt_trk_b
  12841.     moveq.l    #0,d0                *arcc no.=0
  12842.     bsr    do_wrt_trk_b
  12843.     moveq.l    #1,d0                *omt
  12844.     bsr    do_wrt_trk_b
  12845.     move.l    d1,d0                *speed value
  12846.     bsr    consider_trkfrq_st        *trkfrqを考慮する
  12847.     bsr    do_wrt_trk_w
  12848.     bra    mml_lp
  12849.  
  12850. mml_velocity_depth:                *[VELOCITY.DEPTH]
  12851.     moveq.l    #vseq8_zmd,d0
  12852.     bsr    do_wrt_trk_b
  12853.     bra    get_8_depth
  12854. mml_arcc4_depth:                *[ARCC4.DEPTH]
  12855.     moveq.l    #6,d1
  12856.     bra    @f
  12857. mml_arcc3_depth:                *[ARCC3.DEPTH]
  12858.     moveq.l    #4,d1
  12859.     bra    @f
  12860. mml_arcc2_depth:                *[ARCC2.DEPTH]
  12861.     moveq.l    #2,d1
  12862.     bra    @f
  12863. mml_arcc1_depth:                *[ARCC1.DEPTH]
  12864.     moveq.l    #0,d1
  12865. @@:
  12866.     moveq.l    #arcc8_zmd,d0
  12867.     bsr    do_wrt_trk_b
  12868.     move.l    d1,d0
  12869.     bsr    do_wrt_trk_b            *arcc no.
  12870. get_8_depth:
  12871.     bsr    skip_spc
  12872.     cmp.l    a4,d4
  12873.     bls    m_parameter_cannot_be_omitted
  12874.     cmpi.b    #',',(a4)
  12875.     beq    1f
  12876.     lea    switch_strv2(pc),a1
  12877.     bsr    get_com_no
  12878.     bmi    1f
  12879.     subq.b    #1,d0            *-1,0,1,2
  12880.     beq    mad_off            *OFF
  12881.     bra    @f
  12882. 1:
  12883.     moveq.l    #0,d0            *no touch
  12884. @@:
  12885.     move.l    tpt_now(a5),d5        *あとでomtを格納するため
  12886.     bsr    do_wrt_trk_b        *mode
  12887.     moveq.l    #0,d0
  12888.     bsr    do_wrt_trk_b        *dummy omt
  12889.     bsr    skip_sep
  12890.     bsr    get_@a_prm
  12891.     bsr    chk_num
  12892.     bpl    m_too_many_parameters    *パラメータ多すぎ
  12893.     move.l    tpt_addr(a5),a1
  12894.     add.l    d5,a1
  12895.     cmpi.w    #1,d6            *パラメータが複数あるか
  12896.     bcs    1f
  12897.     bne    @f
  12898.     move.b    #1,(a1)            *1つのときは強制的にoptional mode
  12899. @@:
  12900.     move.b    d6,1(a1)        *set omt
  12901. 1:
  12902.     rts
  12903.  
  12904. mad_off:
  12905.     moveq.l    #0,d0            *mode=0,omt=0 → OFF
  12906.     bra    do_wrt_trk_w
  12907.  
  12908. mml_@a:                *ARCC
  12909.     moveq.l    #arcc8_zmd,d0
  12910.     bsr    do_wrt_trk_b
  12911.     moveq.l    #0,d0
  12912.     bsr    do_wrt_trk_b    *arcc no.=0
  12913.     move.l    tpt_now(a5),d5    *あとでmode/omtを格納するため
  12914.     moveq.l    #0,d0
  12915.     bsr    do_wrt_trk_w    *2bytes確保(mode=0,omt=0)
  12916.     bsr    get_@a_prm
  12917.     bsr    chk_num
  12918.     bpl    m_too_many_parameters    *パラメータ多すぎ
  12919.     move.l    tpt_addr(a5),a1
  12920.     add.l    d5,a1
  12921.     moveq.l    #1,d0            *optional mode
  12922.     cmpi.w    #1,d6            *パラメータが複数あるか
  12923.     bcs    mml_lp
  12924.     beq    @f
  12925.     moveq.l    #-1,d0            *1/8 mode(複数の場合)
  12926. @@:
  12927.     move.b    d0,(a1)+        *mode
  12928.     move.b    d6,(a1)+        *set omt
  12929.     bra    mml_lp
  12930.  
  12931. get_@a_prm:
  12932.     moveq.l    #0,d6        *omt
  12933.     bsr    skip_spc
  12934.     cmp.l    a4,d4
  12935.     bls    exit_g@ap
  12936.     cmpi.b    #',',(a4)
  12937.     beq    @f
  12938.     bsr    chk_num
  12939.     bmi    exit_g@ap    *@aだけの場合はmode=0,omt=0でスイッチオフ
  12940. @@:
  12941.     moveq.l    #0,d2        *loop counter
  12942.     moveq.l    #0,d3        *previous value
  12943. mml_arcc_lp01:
  12944.     moveq.l    #0,d1
  12945.     bsr    chk_num
  12946.     bpl    @f
  12947.     cmp.l    a4,d4
  12948.     bls    exit_g@ap
  12949.     cmpi.b    #',',(a4)
  12950.     bne    exit_g@ap
  12951.     bsr    skip_sep    *skip ','
  12952.     bra    next_g@ap
  12953. @@:                *振幅パラメータ有り
  12954.     move.b    (a4),d0
  12955.     cmpi.b    #'+',d0
  12956.     beq    rltv_arcc_depth
  12957.     cmpi.b    #'-',d0
  12958.     bne    @f
  12959. rltv_arcc_depth:        *相対指定ケース
  12960.     bsr    get_num
  12961.     add.l    d3,d1
  12962.     bra    chk_arsz
  12963. @@:
  12964.     bsr    get_num
  12965. chk_arsz:
  12966.     move.l    d1,d0
  12967.     bpl    @f
  12968.     neg.l    d0
  12969. @@:
  12970.     cmpi.l    #-128,d1
  12971.     blt    m_illegal_depth_value    *値が8bit範囲より大きいとエラー
  12972.     cmpi.l    #127,d1
  12973.     bgt    m_illegal_depth_value    *値が8bit範囲より大きいとエラー
  12974.     bsr    skip_sep    *skip ','
  12975.     * < d1.l=arcc depth
  12976.     bset.l    d2,d6        *set omt
  12977.     bsr    wrt_data_d1    *振幅書き込み
  12978.     move.l    d1,d3        *save d1 into d3
  12979. next_g@ap:
  12980.     bsr    chk_num
  12981.     bpl    @f
  12982.     cmp.l    a4,d4
  12983.     bls    exit_g@ap
  12984.     cmpi.b    #',',(a4)    *まだパラメータがあるか
  12985.     bne    exit_g@ap
  12986. @@:
  12987.     addq.w    #1,d2
  12988.     cmpi.w    #modu_max,d2
  12989.     bcs    mml_arcc_lp01
  12990. exit_g@ap:
  12991.     rts
  12992.  
  12993. mml_arcc4_reset:        *[ARCC4.RESET]
  12994.     moveq.l    #6,d5        *arcc no.
  12995.     bra    @f
  12996. mml_arcc3_reset:        *[ARCC3.RESET]
  12997.     moveq.l    #4,d5        *arcc no.
  12998.     bra    @f
  12999. mml_arcc2_reset:        *[ARCC2.RESET]
  13000.     moveq.l    #2,d5        *arcc no.
  13001.     bra    @f
  13002. mml_arcc1_reset:        *[ARCC1.RESET]
  13003.     moveq.l    #0,d5        *arcc no.
  13004. @@:
  13005.     moveq.l    #0,d6        *omt
  13006.                 *get reset value
  13007.     bsr    chk_num
  13008.     bmi    m_parameter_cannot_be_omitted
  13009.     bsr    get_num
  13010.     cmpi.l    #127,d1
  13011.     bhi    m_illegal_reset_value
  13012.     moveq.l    #asgn_arcc_zmd,d0
  13013.     bsr    do_wrt_trk_b
  13014.     move.l    d5,d0        *arcc number
  13015.     bsr    do_wrt_trk_b
  13016.     moveq.l    #%0100_0000,d0    *omt
  13017.     bsr    do_wrt_trk_b
  13018.     move.l    d1,d0        *reset value
  13019.     bra    do_wrt_trk_b
  13020.  
  13021. mml_arcc4_origin:        *[ARCC4.ORIGIN]
  13022.     moveq.l    #6,d5        *arcc no.
  13023.     bra    @f
  13024. mml_arcc3_origin:        *[ARCC3.ORIGIN]
  13025.     moveq.l    #4,d5        *arcc no.
  13026.     bra    @f
  13027. mml_arcc2_origin:        *[ARCC2.ORIGIN]
  13028.     moveq.l    #2,d5        *arcc no.
  13029.     bra    @f
  13030. mml_arcc1_origin:        *[ARCC1.ORIGIN]
  13031.     moveq.l    #0,d5        *arcc no.
  13032. @@:
  13033.     moveq.l    #0,d6        *omt
  13034.                 *get origin value
  13035.     bsr    chk_num
  13036.     bmi    m_parameter_cannot_be_omitted
  13037.     bsr    get_num
  13038.     cmp.l    #127,d1
  13039.     bhi    m_illegal_wave_origin
  13040.     moveq.l    #asgn_arcc_zmd,d0
  13041.     bsr    do_wrt_trk_b
  13042.     move.l    d5,d0        *arcc number
  13043.     bsr    do_wrt_trk_b
  13044.     moveq.l    #%0010_0000,d0    *omt
  13045.     bsr    do_wrt_trk_b
  13046.     move.l    d1,d0        *origin value
  13047.     bra    do_wrt_trk_b
  13048.  
  13049. mml_arcc4_control:        *[ARCC4.CONTROL]
  13050.     moveq.l    #6,d5        *arcc no.
  13051.     bra    @f
  13052. mml_arcc3_control:        *[ARCC3.CONTROL]
  13053.     moveq.l    #4,d5        *arcc no.
  13054.     bra    @f
  13055. mml_arcc2_control:        *[ARCC2.CONTROL]
  13056.     moveq.l    #2,d5        *arcc no.
  13057.     bra    @f
  13058. mml_arcc1_control:        *[ARCC1.CONTROL]
  13059.     moveq.l    #0,d5        *arcc no.
  13060. @@:
  13061.     moveq.l    #0,d6        *omt
  13062.                 *get control number
  13063.     bsr    chk_num
  13064.     bpl    get_@c_prm
  13065.     lea    control_name(pc),a1    *MIDIコントロールパラメータ
  13066.     bsr    get_com_no
  13067.     bmi    @f
  13068.     move.l    d0,d2
  13069.     bra    mark_gotarcctrl
  13070. @@:
  13071.     lea    control_name2(pc),a1    *FM音源パラメータ
  13072.     bsr    get_com_no
  13073.     bmi    m_illegal_control_number
  13074.     move.l    d0,d2
  13075.     add.w    #$80,d2
  13076.     bra    mark_gotarcctrl
  13077.  
  13078. mml_arcc4_phase:        *[ARCC4.PHASE]
  13079.     moveq.l    #6,d5        *arcc no.
  13080.     bra    @f
  13081. mml_arcc3_phase:        *[ARCC3.PHASE]
  13082.     moveq.l    #4,d5        *arcc no.
  13083.     bra    @f
  13084. mml_arcc2_phase:        *[ARCC2.PHASE]
  13085.     moveq.l    #2,d5        *arcc no.
  13086.     bra    @f
  13087. mml_arcc1_phase:        *[ARCC1.PHASE]
  13088.     moveq.l    #0,d5        *arcc no.
  13089. @@:
  13090.     moveq.l    #0,d6        *omt
  13091.                 *get phase type
  13092.     bsr    chk_num
  13093.     bmi    @f
  13094.     bsr    get_num
  13095.     tst.l    d1
  13096.     bra    1f
  13097. @@:
  13098.     lea    phase_tbl(pc),a1
  13099.     bsr    get_com_no
  13100.     bmi    m_undefined_phase_type
  13101.     moveq.l    #0,d1
  13102.     tst.l    d0
  13103. 1:
  13104.     beq    @f
  13105.     moveq.l    #-1,d1
  13106. @@:
  13107.     moveq.l    #asgn_arcc_zmd,d0
  13108.     bsr    do_wrt_trk_b
  13109.     move.l    d5,d0        *arcc number
  13110.     bsr    do_wrt_trk_b
  13111.     moveq.l    #%0001_0000,d0    *omt
  13112.     bsr    do_wrt_trk_b
  13113.     move.l    d1,d0        *reset value
  13114.     bra    do_wrt_trk_b
  13115.  
  13116. mml_@c:                *ARCCコンフィギュレーション
  13117.     moveq.l    #0,d5        *arcc no.
  13118. get_@c_prm:
  13119.     moveq.l    #0,d6        *omt
  13120.                 *get control number
  13121.     bsr    chk_num
  13122.     bmi    @f
  13123.     bsr    get_num
  13124.     cmp.l    #255,d1
  13125.     bhi    m_illegal_arcc_control    *規定外のコントロール
  13126.     move.l    d1,d2
  13127. mark_gotarcctrl:
  13128.     tas.b    d6
  13129. @@:                *get reset value
  13130.     bsr    skip_sep    *skip ','
  13131.     bsr    chk_num
  13132.     bmi    @f
  13133.     bsr    get_num
  13134.     cmp.l    #255,d1
  13135.     bhi    m_illegal_reset_value
  13136.     move.l    d1,d3
  13137.     ori.b    #$40,d6
  13138. @@:                *get wave basis
  13139.     bsr    skip_sep    *skip ','
  13140.     bsr    chk_num
  13141.     bmi    @f
  13142.     bsr    get_num
  13143.     cmp.l    #255,d1
  13144.     bhi    m_illegal_wave_origin
  13145.     move.l    d1,a1
  13146.     ori.b    #$20,d6
  13147. @@:
  13148.     bsr    skip_sep    *get phase
  13149.     bsr    chk_num
  13150.     bmi    @f
  13151.     bsr    get_num
  13152.     ori.b    #$10,d6
  13153.     tst.l    d1        *0:正位相
  13154.     beq    @f
  13155.     moveq.l    #-1,d1        *-1:逆位相
  13156. @@:
  13157.     tst.b    d6
  13158.     beq    m_illegal_parameters_combination    *全部省略はダメ
  13159.     moveq.l    #asgn_arcc_zmd,d0
  13160.     bsr    do_wrt_trk_b
  13161.     move.l    d5,d0            *arcc no.
  13162.     bsr    do_wrt_trk_b
  13163.     move.l    d6,d0            *omt
  13164.     bsr    do_wrt_trk_b
  13165.     tst.b    d6
  13166.     bpl    @f
  13167.     move.l    d2,d0            *ctrl n
  13168.     bsr    do_wrt_trk_b
  13169. @@:
  13170.     add.b    d6,d6
  13171.     bpl    @f
  13172.     move.l    d3,d0            *reset v
  13173.     bsr    do_wrt_trk_b
  13174. @@:
  13175.     add.b    d6,d6
  13176.     bpl    @f
  13177.     move.l    a1,d0            *middle v
  13178.     bsr    do_wrt_trk_b
  13179. @@:
  13180.     add.b    d6,d6
  13181.     bpl    @f
  13182.     move.l    d1,d0            *phase
  13183.     bsr    do_wrt_trk_b
  13184. @@:
  13185.     tst.b    seq_cmd-work(a6)
  13186.     beq    mml_lp
  13187.     rts
  13188. *-----------------------------------------------------------------------------
  13189. mml_arcc4_waveform:            *[ARCC4.WAVEFORM]
  13190.     moveq.l    #6,d2
  13191.     bra    @f
  13192. mml_arcc3_waveform:            *[ARCC3.WAVEFORM]
  13193.     moveq.l    #4,d2
  13194.     bra    @f
  13195. mml_arcc2_waveform:            *[ARCC2.WAVEFORM]
  13196.     moveq.l    #2,d2
  13197.     bra    @f
  13198. mml_arcc1_waveform:            *[ARCC1.WAVEFORM]
  13199.     moveq.l    #0,d2
  13200. @@:
  13201.     bsr    chk_num
  13202.     bpl    @f
  13203.     lea    wvfm_tbl(pc),a1
  13204.     bsr    get_com_no
  13205.     bmi    m_illegal_wave_number    *規定外
  13206.     move.l    d0,d1
  13207.     bra    do_wrt_arccwvfm
  13208. @@:
  13209.     bsr    get_num
  13210.     cmp.l    #wv_reg_max+wv_def_max-1,d1
  13211.     bhi    m_illegal_wave_number    *規定外
  13212.     cmpi.b    #4,d1
  13213.     bls    do_wrt_arccwvfm
  13214.     cmpi.b    #7,d1
  13215.     bls    m_illegal_wave_number    *4~7はリザーブ
  13216.     subq.w    #8,d1
  13217.     ori.w    #$8000,d1        *ユーザー波形マーク
  13218. do_wrt_arccwvfm:
  13219.     moveq.l    #arcc_wf_zmd,d0
  13220.     bsr    do_wrt_trk_b
  13221.     move.l    d2,d0            *arcc number(0-3)*2
  13222.     bsr    do_wrt_trk_b
  13223.     move.l    d1,d0            *wf number
  13224.     bra    do_wrt_trk_w
  13225. *-----------------------------------------------------------------------------
  13226. mml_master_fader:        *[MASTER_FADER]
  13227.     bsr    skip_spc
  13228.     cmp.l    a4,d4
  13229.     bls    m_illegal_command_line
  13230.     cmpi.b    #']',(a4)
  13231.     beq    m_illegal_command_line
  13232.     lea    mstrfdrdvid,a2
  13233.     moveq.l    #0,d2                *指定されたデバイスのマーカー
  13234. mmlsetmstrfdrlp:
  13235.     bsr    skip_spc
  13236.     cmp.l    a4,d4
  13237.     bls    m_illegal_command_line
  13238.     cmpi.b    #']',(a4)
  13239.     beq    exit_mmlmstrfdr
  13240.     moveq.l    #master_fader_zmd,d0
  13241.     bsr    do_wrt_trk_b
  13242.     lea    mstrfadr_dev(pc),a1        *デバイス名テーブル
  13243.     jsr    get_com_no-work(a6)            *> d0
  13244.     bmi    m_illegal_device_id
  13245.     subq.l    #1,d0
  13246.     bcs    mmlmstrfdrall
  13247.     bset.l    d0,d2                *mark
  13248.     bne    m_device_id_redesignation    *同一デバイス名が複数回指定されている
  13249.     add.w    d0,d0
  13250.     move.w    (a2,d0.w),d0
  13251. mmlsetmstrfdrdev:
  13252.     bsr    do_wrt_trk_w    *device
  13253.     bsr    skip_sep
  13254.     moveq.l    #0,d5        *off speed value
  13255.     moveq.l    #0,d6        *omt
  13256.     bsr    chk_num
  13257.     bpl    @f
  13258.     lea    switch_strv(pc),a1
  13259.     jsr    get_com_no-work(a6)        *文字パラメータは"OFF"のみ有効
  13260.     bmi    m_illegal_switch_value
  13261.     tst.l    d0
  13262.     bne    m_illegal_switch_value
  13263.     bra    do_wrt_mstfd            *オフ
  13264. @@:
  13265.     bsr    get_spd_fdlvl    *>d6.b=omt
  13266. do_wrt_mstfd:
  13267.     move.l    d6,d0
  13268.     bsr    do_wrt_trk_b    *omt
  13269.     lsr.b    #1,d6
  13270.     bcc    @f
  13271.     move.l    d5,d0
  13272.     bsr    do_wrt_trk_w    *speed(switch)
  13273. @@:
  13274.     lsr.b    #1,d6
  13275.     bcc    @f
  13276.     bsr    wrt_data_d2    *start level
  13277. @@:
  13278.     lsr.b    #1,d6
  13279.     bcc    @f
  13280.     bsr    wrt_data_d3    *end level
  13281. @@:
  13282.     bsr    skip_sep
  13283.     bra    mmlsetmstrfdrlp
  13284. exit_mmlmstrfdr:
  13285.     rts
  13286.  
  13287. mmlmstrfdrall:                    *マスターフェーダー全デバイス設定ケース
  13288.     tst.l    d2
  13289.     bne    m_device_id_redesignation    *同一デバイス名が複数回指定されている
  13290.     moveq.l    #-1,d2                *全デバイス設定したというマーク
  13291.     moveq.l    #-1,d0                *全デバイスを操作対象とするマーク
  13292.     bsr    do_wrt_trk_w            *device
  13293.     bsr    skip_sep
  13294.     moveq.l    #0,d5                *off value
  13295.     moveq.l    #0,d6                *omt
  13296.     bsr    chk_num
  13297.     bpl    @f
  13298.     lea    switch_strv(pc),a1
  13299.     jsr    get_com_no-work(a6)        *文字パラメータは"OFF"のみ有効
  13300.     bmi    m_illegal_switch_value
  13301.     tst.l    d0
  13302.     bne    m_illegal_switch_value
  13303.     bra    do_wrt_mstfdall            *オフ
  13304. @@:
  13305.     bsr    get_spd_fdlvl    *>d6.b=omt
  13306. do_wrt_mstfdall:
  13307.     move.l    d6,d0
  13308.     bsr    do_wrt_trk_b    *omt
  13309.     lsr.b    #1,d6
  13310.     bcc    @f
  13311.     move.l    d5,d0
  13312.     bsr    do_wrt_trk_w    *speed(switch)
  13313. @@:
  13314.     lsr.b    #1,d6
  13315.     bcc    @f
  13316.     bsr    wrt_data_d2    *start level
  13317. @@:
  13318.     lsr.b    #1,d6
  13319.     bcs    wrt_data_d3    *end level
  13320.     rts
  13321.  
  13322. mml_ch_fader:            *[CH_FADER]
  13323.     bsr    skip_spc
  13324.     cmp.l    a4,d4
  13325.     bls    m_illegal_command_line
  13326.     cmpi.b    #']',(a4)
  13327.     beq    m_illegal_command_line
  13328. mchfd_lp:
  13329.     bsr    skip_spc
  13330.     cmp.l    a4,d4
  13331.     bls    m_illegal_command_line
  13332.     cmpi.b    #']',(a4)
  13333.     beq    exit_mmlchfdr
  13334.     lea    chfdr_dev(pc),a1
  13335.     jsr    get_com_no-work(a6)    *> d0
  13336.     bpl    chfdr_all_case
  13337.     jbsr    get_str_ch        *> d2=type,ch
  13338.     bne    m_error_code_exit
  13339.     swap    d2
  13340.     cmpi.w    #-1,d2        *get_str_chでの上位ワード=-1はカレントMIDIを表すから
  13341.     bne    @f        *これを有効パラメータに変換する
  13342.     move.w    #$7ffd,d2
  13343. @@:
  13344.     swap    d2
  13345.     move.l    d2,d7        *d7=type,ch
  13346. mchfd00:
  13347.     bsr    skip_sep
  13348.     moveq.l    #0,d5        *off value
  13349.     moveq.l    #0,d6        *omt
  13350.     bsr    chk_num
  13351.     bpl    @f
  13352.     lea    switch_strv(pc),a1
  13353.     jsr    get_com_no-work(a6)    *文字パラメータは"OFF"のみ有効
  13354.     bmi    m_illegal_switch_value
  13355.     tst.l    d0
  13356.     bne    m_illegal_switch_value
  13357.     bra    do_wrt_chfdr    *オフ
  13358. @@:                *スピード、開始終了レベル取得
  13359.     bsr    get_spd_fdlvl    *> d6.b=omt
  13360. do_wrt_chfdr:
  13361.     moveq.l    #ch_fader_zmd,d0
  13362.     bsr    do_wrt_trk_b
  13363.     move.l    d7,d0
  13364.     bsr    do_wrt_trk_l    *type,ch
  13365.     move.l    d6,d0
  13366.     bsr    do_wrt_trk_b    *omt
  13367.     lsr.b    #1,d6
  13368.     bcc    @f
  13369.     move.l    d5,d0
  13370.     bsr    do_wrt_trk_w    *speed(switch)
  13371. @@:
  13372.     lsr.b    #1,d6
  13373.     bcc    @f
  13374.     bsr    wrt_data_d2    *start level
  13375. @@:
  13376.     lsr.b    #1,d6
  13377.     bcc    @f
  13378.     bsr    wrt_data_d3    *end level
  13379. @@:
  13380.     bsr    skip_sep
  13381.     bra    mchfd_lp
  13382. exit_mmlchfdr:
  13383.     rts
  13384.  
  13385. chfdr_all_case:            *全xxxCASE
  13386.     * < d0.l=com no(0:all,1:FM-all,2:ADPCM-all,3:MIDI1-all,4:MIDI2-all,5:MIDI3-all)
  13387.     lsl.w    #2,d0
  13388.     move.l    cac_tbl(pc,d0.w),d7
  13389.     bne    mchfd00
  13390.     moveq.l    #-1,d7
  13391.     bsr    chk_num
  13392.     bmi    mchfd00        *ALLのみの指定なのでALL-DEVICE,ALL-CHとみなす
  13393.     bsr    get_num
  13394.     tst.l    d1
  13395.     bpl    @f
  13396.     neg.l    d1        *絶対値に
  13397. @@:
  13398.     subq.w    #1,d1
  13399.     cmpi.l    #15,d1
  13400.     bhi    m_illegal_channel
  13401.     move.w    d1,d7        *ALL-DEVICE,CH-xという指定
  13402.     bra    mchfd00
  13403.  
  13404. cac_tbl:
  13405.     dc.l    0        *dummy
  13406.     dc.l    $0000_ffff    *fm all
  13407.     dc.l    $0001_ffff    *adpcm all
  13408.     dc.l    $8000_ffff    *midi1 all
  13409.     dc.l    $8001_ffff    *midi2 all
  13410.     dc.l    $8002_ffff    *midi3 all
  13411.  
  13412. mml_track_fader:        *[TRACK_FADER]
  13413.     moveq.l    #0,d5        *off value
  13414.     moveq.l    #0,d6        *omt
  13415.     bsr    chk_num
  13416.     bpl    @f
  13417.     lea    switch_strv(pc),a1
  13418.     jsr    get_com_no-work(a6)    *文字パラメータは"OFF"のみ有効
  13419.     bmi    m_illegal_switch_value
  13420.     tst.l    d0
  13421.     bne    m_illegal_switch_value
  13422.     bra    do_wrt_fdr    *オフ
  13423. @@:
  13424.     moveq.l    #0,d5        *off value
  13425.     moveq.l    #0,d6        *omt
  13426.     bsr    get_spd_fdlvl    *> d6.b=omt
  13427.     moveq.l    #%111,d6
  13428.     bra    do_wrt_fdr
  13429.  
  13430. mml_fader_v2:            *\ cmd
  13431.     moveq.l    #0,d5        *off value
  13432.     moveq.l    #0,d6        *omt
  13433.     bsr    get_spd_fdlvl    *> d6.b=omt
  13434.     moveq.l    #%111,d6
  13435.     lsl.w    #8,d5        *v2との互換性のため
  13436. do_wrt_fdr:
  13437.     moveq.l    #ch_fader_zmd,d0
  13438.     bsr    do_wrt_trk_b
  13439.     move.l    #$7ffe_0000,d0    *track-ch
  13440.     bsr    do_wrt_trk_l    *type,ch
  13441.     move.l    d6,d0
  13442.     bsr    do_wrt_trk_b
  13443.     lsr.b    #1,d6
  13444.     bcc    @f
  13445.     move.l    d5,d0
  13446.     bsr    do_wrt_trk_w    *speed(switch)
  13447. @@:
  13448.     lsr.b    #1,d6
  13449.     bcc    @f
  13450.     bsr    wrt_data_d2    *start level
  13451. @@:
  13452.     lsr.b    #1,d6
  13453.     bcc    @f
  13454.     bsr    wrt_data_d3    *end level
  13455. @@:
  13456.     tst.b    seq_cmd-work(a6)
  13457.     beq    mml_lp
  13458.     rts
  13459.  
  13460. get_spd_fdlvl:
  13461.     moveq.l    #0,d5        *off value
  13462.     moveq.l    #0,d6        *omt
  13463.     bsr    chk_num
  13464.     bmi    gsf00        *数字がない時はオフ
  13465.     bset.l    #0,d6
  13466.     move.l    #128,d2        *start level default(for v2 fader param.)
  13467.     moveq.l    #0,d3        *end level default(for v2 fader param.)
  13468.     bsr    get_num
  13469.     move.l    d1,d5        *copy
  13470.     bpl    @f
  13471.     neg.l    d5        *スピードが負値の場合はデフォルトパラメータでフェードイン
  13472.     exg.l    d2,d3        *for v2 fader param.
  13473. @@:
  13474.     cmpi.l    #fader_spd_max,d5    *speed maxチェック
  13475.     bhi    m_illegal_fader_speed
  13476. gsf00:
  13477.     bsr    skip_sep
  13478.     bsr    chk_num
  13479.     bmi    @f        *パラメータがこれ以上ない場合はデフォルトでフェードアウト
  13480.     bset.l    #1,d6
  13481.     bsr    get_num        *get start level
  13482.     cmpi.l    #128,d1
  13483.     bhi    m_illegal_fader_level
  13484.     move.l    d1,d2
  13485. @@:
  13486.     bsr    skip_sep
  13487.     bsr    chk_num
  13488.     bmi    @f
  13489.     bset.l    #2,d6
  13490.     bsr    get_num        *get end level
  13491.     cmpi.l    #128,d1
  13492.     bhi    m_illegal_fader_level
  13493.     move.l    d1,d3
  13494. @@:
  13495.     rts
  13496.  
  13497. mml_noise:            *[NOISE]
  13498.     moveq.l    #0,d1
  13499.     bsr    chk_num
  13500.     bpl    get_@o_n
  13501.     lea    noise_strv(pc),a1
  13502.     jbsr    get_com_no    *文字パラメータは"OFF"のみ有効
  13503.     bpl    @f
  13504.     bra    m_illegal_switch_value
  13505.  
  13506. mml_@o:                *OPM noise設定
  13507.     moveq.l    #0,d1
  13508.     bsr    chk_num
  13509.     bmi    @f
  13510. get_@o_n:
  13511.     bsr    get_num
  13512.     cmpi.l    #31,d1
  13513.     bhi    m_illegal_noise_parameter
  13514.     tas.b    d1
  13515. @@:
  13516.     moveq.l    #reg_set_zmd,d0    *fm reg write cmd
  13517.     bsr    do_wrt_trk_b
  13518.     moveq.l    #15,d0        *noise reg no.
  13519.     bsr    do_wrt_trk_b
  13520.     bsr    wrt_data_d1
  13521.     tst.b    seq_cmd-work(a6)
  13522.     beq    mml_lp
  13523.     rts
  13524.  
  13525. mml_rltv_vol_dwn:            *相対ボリュームダウン
  13526.     bsr    chk_num
  13527.     bmi    rltv_vd_dflt
  13528.     bsr    get_num
  13529.     cmp.l    #127,d1
  13530.     bhi    m_illegal_volume_value
  13531.     move.b    d1,tpt_rltv_vol(a5)
  13532.     bra    @f
  13533. rltv_vd_dflt:
  13534.     moveq.l    #0,d1
  13535.     move.b    tpt_rltv_vol(a5),d1
  13536. @@:
  13537.     moveq.l    #'_',d0
  13538.     bsr    rvm            *連続設定されていた場合は最適化
  13539.     moveq.l    #rltv_vol_zmd,d0
  13540.     tst.b    velo_vol_ctrl-work(a6)    *~_記号を相対ベロシティにアサインしているか
  13541.     beq    @f
  13542.     moveq.l    #rltv_velo_zmd,d0
  13543. @@:
  13544.     bsr    do_wrt_trk_b
  13545.     move.l    d1,d0
  13546.     neg.b    d0
  13547.     bsr    do_wrt_trk_b
  13548.     tst.b    seq_cmd-work(a6)
  13549.     beq    mml_lp
  13550.     rts
  13551.  
  13552. mml_rltv_vol_up:            *相対ボリュームアップ
  13553.     bsr    chk_num
  13554.     bmi    rltv_vu_dflt
  13555.     bsr    get_num
  13556.     cmpi.l    #127,d1
  13557.     bhi    m_illegal_volume_value
  13558.     move.b    d1,tpt_rltv_vol(a5)
  13559.     bra    @f
  13560. rltv_vu_dflt:
  13561.     moveq.l    #0,d1
  13562.     move.b    tpt_rltv_vol(a5),d1
  13563. @@:
  13564.     moveq.l    #'~',d0
  13565.     bsr    rvm            *連続設定されていた場合は最適化
  13566.     moveq.l    #rltv_vol_zmd,d0
  13567.     tst.b    velo_vol_ctrl-work(a6)    *~_記号を相対ベロシティにアサインしているか
  13568.     beq    @f
  13569.     moveq.l    #rltv_velo_zmd,d0
  13570. @@:
  13571.     bsr    do_wrt_trk_b
  13572.     move.l    d1,d0
  13573.     bsr    do_wrt_trk_b
  13574.     tst.b    seq_cmd-work(a6)
  13575.     beq    mml_lp
  13576.     rts
  13577.  
  13578. rvm:
  13579.     * < d0.b='~','_'
  13580.     moveq.l    #1,d2
  13581. vdlp:
  13582.     bsr    skip_spc
  13583.     move.l    a4,d3        *save a4
  13584.     cmp.l    a4,d4
  13585.     bls    @f
  13586.     cmp.b    (a4),d0
  13587.     bne    @f
  13588.     addq.w    #1,a4        *skip ~ or _
  13589.     bsr    chk_num
  13590.     bpl    @f
  13591.     addq.w    #1,d2        *数値がないならば最適化対象となる
  13592.     bra    vdlp
  13593. @@:
  13594.     mulu    d2,d1
  13595.     move.l    d3,a4        *get back
  13596.     rts
  13597.  
  13598. mml_damper:            *[DAMPER]
  13599.     bsr    chk_num
  13600.     bpl    @f
  13601.     lea    switch_strv(pc),a1
  13602.     jbsr    get_com_no
  13603.     bmi    mml_@d
  13604.     move.l    d0,d1
  13605.     beq    do_wrt_@d
  13606.     moveq.l    #127,d1        *0か127のいずれかにする
  13607.     bra    do_wrt_@d
  13608. @@:
  13609.     bsr    get_num
  13610.     cmpi.l    #127,d1
  13611.     bhi    m_illegal_damper_value
  13612.     bra    do_wrt_@d
  13613.  
  13614. mml_@d:                *ダンパー
  13615.     moveq.l    #0,d1
  13616.     bsr    chk_num
  13617.     bmi    do_wrt_@d
  13618.     bsr    get_num
  13619.     cmpi.l    #127,d1
  13620.     bhi    m_illegal_damper_value
  13621.     tst.l    d1
  13622.     beq    do_wrt_@d
  13623.     moveq.l    #127,d1        *0か127かのどちらかに直す
  13624. do_wrt_@d:
  13625.     moveq.l    #damper_zmd,d0
  13626.     bsr    do_wrt_trk_b
  13627.     bsr    wrt_data_d1
  13628.     tst.b    seq_cmd-work(a6)
  13629.     beq    mml_lp
  13630.     rts
  13631.  
  13632. mml_track_mode:            *[TRACK_MODE]
  13633.     bsr    chk_num
  13634.     bpl    @f
  13635.     lea    track_mode_cmdln(pc),a1
  13636.     jbsr    get_com_no
  13637.     bmi    m_illegal_mode_value
  13638.     move.l    d0,d1
  13639.     bne    @f
  13640.     bra    do_wrt_@r
  13641. mml_@r:
  13642.     pea    mml_lp(pc)
  13643. @@:
  13644.     moveq.l    #0,d1
  13645.     bsr    chk_num
  13646.     bmi    do_wrt_@r
  13647.     bsr    get_num
  13648.     tst.l    d1
  13649.     beq    do_wrt_@r
  13650. @@:
  13651.     moveq.l    #ID_NO_KEYOFF,d1
  13652. do_wrt_@r:
  13653.     moveq.l    #track_mode_zmd,d0
  13654.     bsr    do_wrt_trk_b
  13655.     bra    wrt_data_d1
  13656.  
  13657. mml_timbre_split_switch:        *[TIMBRE_SPLIT.SWITCH]
  13658.     moveq.l    #timbre_split_zmd,d0
  13659.     bsr    do_wrt_trk_b
  13660.     bsr    chk_num
  13661.     bpl    @f
  13662.     lea    switch_strv(pc),a1    *ON/OFF
  13663.     jbsr    get_com_no
  13664.     bmi    m_illegal_switch_value
  13665.     move.l    d0,d1
  13666.     beq    1f            *OFF mark(d1=0)
  13667.     moveq.l    #$80,d1            *ON mark
  13668.     bra    1f
  13669. @@:
  13670.     bsr    get_num
  13671.     tst.l    d1
  13672.     beq    @f
  13673.     moveq.l    #$80,d1            *ON mark
  13674. 1:
  13675.     move.l    d1,d0
  13676.     bra    do_wrt_trk_b        *switch value
  13677.  
  13678. mml_timbre_split:            *[TIMBRE_SPLIT]
  13679.     moveq.l    #timbre_split_zmd,d0
  13680.     bsr    do_wrt_trk_b
  13681.     moveq.l    #$80,d1            *ON mark
  13682.     bsr    chk_num
  13683.     bpl    @f
  13684.     lea    switch_strv(pc),a1    *ON/OFF
  13685.     jbsr    get_com_no
  13686.     bmi    m_illegal_switch_value
  13687.     move.l    d0,d1
  13688.     beq    @f            *OFF mark(d1=0)
  13689.     moveq.l    #$80,d1            *ON mark
  13690. @@:
  13691.     move.l    d1,d0
  13692.     move.l    tpt_now(a5),d5        *あとでsw/n_of_paramを格納するため
  13693.     bsr    do_wrt_trk_b        *dummy
  13694.     moveq.l    #0,d3            *n of param
  13695. mtmsp_lp:
  13696.     bsr    skip_sep
  13697.     cmp.l    a4,d4
  13698.     bls    m_illegal_command_line
  13699.     cmpi.b    #']',(a4)
  13700.     beq    exit_mmltmsp
  13701.  
  13702.     moveq.l    #-1,d2
  13703.     bsr    chk_num            *get bank number
  13704.     bmi    m_parameter_cannot_be_omitted
  13705.     bsr    get_num
  13706.     cmpi.l    #16383,d1
  13707.     bhi    m_illegal_bank_number
  13708.     move.l    d1,d2            *ひとまず保存
  13709.     bsr    skip_spc
  13710.     cmp.l    a4,d4
  13711.     bls    @f
  13712.     cmpi.b    #':',(a4)        *バンクを:で区切って7bit:7bitで表記する場合
  13713.     bne    @f
  13714.     addq.w    #1,a4
  13715.     bsr    chk_num
  13716.     bmi    m_illegal_command_line
  13717.     bsr    get_num
  13718.     cmpi.l    #127,d1
  13719.     bhi    m_illegal_bank_number
  13720.     cmpi.l    #127,d2
  13721.     bhi    m_illegal_bank_number
  13722.     lsl.w    #8,d2
  13723.     move.b    d1,d2
  13724.     bra    1f            *@b1,b2,n
  13725. @@:                    *@b,n
  13726.     add.w    d2,d2
  13727.     lsr.b    #1,d2
  13728. 1:
  13729.     swap    d2
  13730.     bsr    skip_sep
  13731.  
  13732.     bsr    chk_num            *get timbre number
  13733.     bmi    m_parameter_cannot_be_omitted
  13734.     bsr    get_num
  13735.     subq.l    #1,d1
  13736.     cmpi.l    #fmsnd_reg_max-1,d1
  13737.     bhi    m_illegal_timbre_number
  13738.     move.w    d1,d2            *ひとまず保存
  13739.  
  13740.     addq.w    #1,d3
  13741.     cmpi.w    #n_of_split,d3
  13742.     bhi    m_too_many_parameters
  13743.  
  13744.     bsr    skip_sep
  13745.     moveq.l    #-1,d1            *get range start note number
  13746.     bsr    chk_num
  13747.     bmi    @f
  13748.     bsr    get_num
  13749.     bra    do_wrt_stntnmbr
  13750. @@:
  13751.     cmp.l    a4,d4
  13752.     bls    m_illegal_command_line
  13753.     cmpi.b    #',',(a4)
  13754.     beq    do_wrt_stntnmbr
  13755.     bsr    get_note_2way_split    *>d1.l=note number
  13756. do_wrt_stntnmbr:
  13757.     move.l    d1,d0            *set start note number
  13758.     bsr    do_wrt_trk_b
  13759.     bsr    skip_sep
  13760.  
  13761.     moveq.l    #-1,d1            *get range end note number
  13762.     bsr    chk_num
  13763.     bmi    @f
  13764.     bsr    get_num
  13765.     bra    do_wrt_edntnmbr
  13766. @@:
  13767.     cmp.l    a4,d4
  13768.     bls    m_illegal_command_line
  13769.     cmpi.b    #',',(a4)
  13770.     beq    do_wrt_edntnmbr
  13771.     bsr    get_note_2way_split    *>d1.l=note number
  13772. do_wrt_edntnmbr:
  13773.     move.l    d1,d0            *set end note number
  13774.     bsr    do_wrt_trk_b
  13775.     move.l    d2,d0            *set bank number & timbre number
  13776.     bsr    do_wrt_trk_l
  13777.     bra    mtmsp_lp
  13778. exit_mmltmsp:
  13779.     move.l    tpt_addr(a5),a1
  13780.     or.b    d3,(a1,d5.l)        *sw/n_of_paramをセット
  13781.     rts
  13782.  
  13783. get_note_2way_split:            *音階指定
  13784.     * > d1.l=note number
  13785.     movem.l    d0/d2,-(sp)
  13786. @@:
  13787.     cmp.l    a4,d4
  13788.     bls    m_parameter_shortage
  13789.     move.b    (a4),d0
  13790.     jsr    mk_capital-work(a6)
  13791.     cmpi.b    #'.',d0        *skip '.'
  13792.     beq    @b
  13793.     cmpi.b    #'O',d0        *音階、オクターブの順の指定か
  13794.     bne    @f
  13795.     addq.w    #1,a4        *skip 'o'
  13796.     bsr    chk_num
  13797.     bmi    m_illegal_octave
  13798.     bsr    get_num        *d1=octave num
  13799.     cmp.l    a4,d4
  13800.     bls    m_parameter_shortage
  13801.     moveq.l    #0,d2        *dummy bank
  13802.     bsr    get_note_num    *<d1=oct,d2=bank*128
  13803.     bmi    m_illegal_note_number
  13804.     cmp.l    #adpcm_reg_max,d2
  13805.     bcc    m_illegal_note_number
  13806.     move.l    d2,d1
  13807.     movem.l    (sp)+,d0/d2
  13808.     rts
  13809. @@:                *RCP系の音階指定(ex.C#4)
  13810.     cmpi.b    #'A',d0
  13811.     bcs    m_unexpected_operand
  13812.     cmpi.b    #'G',d0
  13813.     bhi    m_unexpected_operand
  13814.     moveq.l    #-1,d1        *dummy octave=-1
  13815.     moveq.l    #0,d2        *dummy bank
  13816.     bsr    get_note_num2    *< d1.l=dummy,d2=bank*128
  13817.     bmi    m_illegal_note_number
  13818.     bsr    chk_num
  13819.     bmi    m_illegal_note_number
  13820.     bsr    get_num        *get octave
  13821.     cmp.l    a4,d4
  13822.     bls    m_parameter_shortage
  13823.     addq.w    #1,d1        *-1~9→0-10
  13824.     mulu    #12,d1
  13825.     add.w    d1,d2
  13826.     cmpi.l    #adpcm_reg_max,d2
  13827.     bcc    m_illegal_note_number
  13828.     move.l    d2,d1
  13829.     movem.l    (sp)+,d0/d2
  13830.     rts
  13831.  
  13832. mml_bend_range:            *[BEND_RANGE n]
  13833. mml_@g:                *ベンドレンジチェンジ
  13834.     bsr    chk_num
  13835.     bmi    m_parameter_cannot_be_omitted
  13836.     bsr    get_num
  13837.     cmpi.l    #127,d1
  13838.     bhi    m_illegal_bend_range
  13839.     moveq.l    #bend_range_zmd,d0
  13840.     bsr    do_wrt_trk_b
  13841.     bsr    wrt_data_d1
  13842.     tst.b    seq_cmd-work(a6)
  13843.     beq    mml_lp
  13844.     rts
  13845.  
  13846. mml_program_bank:        *[PROGRAM_BANK]
  13847. mml_i:                *音色バンク切り換え
  13848.     moveq.l    #0,d2
  13849.     moveq.l    #0,d3
  13850.     bsr    chk_num
  13851.     bmi    @f
  13852.     bsr    get_num
  13853.     cmpi.l    #127,d1
  13854.     bhi    mk_bank_i    *127以上は2バイトへ
  13855.     move.l    d1,d2
  13856. @@:
  13857.     bsr    skip_sep
  13858.     bsr    chk_num
  13859.     bmi    do_wrt_i    *第2パラメータがない
  13860.     bsr    get_num
  13861.     cmpi.l    #127,d1
  13862.     bhi    @f        *too big
  13863.     move.l    d1,d3
  13864.     bra    do_wrt_i
  13865. mk_bank_i:            *2バイト目を作る
  13866.     move.l    d2,d3
  13867.     moveq.l    #127,d0
  13868.     and.b    d0,d3
  13869.     lsr.w    #7,d2
  13870.     and.b    d0,d2
  13871.     bsr    skip_sep
  13872.     bsr    chk_num
  13873.     bpl    m_too_many_parameters
  13874. do_wrt_i:
  13875.     moveq.l    #bank_select_zmd,d0
  13876.     bsr    do_wrt_trk_b
  13877.     bsr    wrt_data_d2    *H
  13878.     bsr    wrt_data_d3    *L
  13879.     tst.b    seq_cmd-work(a6)
  13880.     beq    mml_lp
  13881.     rts
  13882.  
  13883. mml_replay:                *[REPLAY]
  13884. mml_j:                    *強制再演奏
  13885.     bsr    chk_num
  13886.     bmi    m_parameter_cannot_be_omitted
  13887.     bsr    get_num
  13888.     subq.l    #1,d1
  13889.     cmpi.l    #tr_max-1,d1
  13890.     bhi    m_illegal_track_number
  13891.     bsr    check_trk_no
  13892.     moveq.l    #forceplay_zmd,d0
  13893.     bsr    do_wrt_trk_b
  13894.     move.l    d1,d0
  13895.     bsr    reg_trkn        *トラック番号セット
  13896.     bsr    do_wrt_trk_w
  13897.     tst.b    seq_cmd-work(a6)
  13898.     beq    mml_lp
  13899.     rts
  13900.  
  13901. check_trk_no:            *トラック番号nが有効かチェック
  13902.     * < d1.l=trk number(0~)
  13903.     * - all
  13904. reglist    reg    d0-d2/a1
  13905.     movem.l    reglist,-(sp)
  13906.     move.l    trk_inf_tbl(pc),a1
  13907.     move.l    tit_size(pc),d2
  13908.     add.l    a1,d2
  13909. @@:
  13910.     cmp.w    (a1)+,d1
  13911.     beq    @f
  13912.     move.l    (a1)+,d0
  13913.     beq    m_undefined_track_referred
  13914.     add.l    d0,a1
  13915.     cmp.l    d2,a1
  13916.     bhi    m_undefined_track_referred
  13917.     bra    @b
  13918. @@:
  13919.     movem.l    (sp)+,reglist
  13920.     rts
  13921.  
  13922. mml_direct_zmd:                    *; コマンド
  13923.     btst.b    #c_renp1,tpt_mode_flg(a5)    *連符内には使用出来ない
  13924.     bne    m_illegal_command_in_brace
  13925.     bsr    chk_num
  13926.     bmi    m_parameter_cannot_be_omitted    *値が一個もない時はエラー
  13927.     bsr    m_zmd_directly_embedded
  13928. @@:
  13929.     bsr    get_num
  13930.     cmpi.l    #255,d1
  13931.     bhi    m_undefined_zmd_code
  13932.     move.l    d1,d0
  13933.     bsr    do_wrt_trk_b
  13934.     bsr    skip_sep
  13935.     bsr    chk_num
  13936.     bpl    @b
  13937.     bra    mml_lp
  13938.  
  13939. mml_dummy:                    *[DUMMY]
  13940.     moveq.l    #next_cmd_zmd,d0
  13941.     bra    do_wrt_trk_b
  13942.  
  13943. mml_poke:                    *? コマンド
  13944.     bsr    chk_num
  13945.     bmi    m_parameter_cannot_be_omitted    *値が一個もない時はエラー
  13946.     bsr    get_num                *get addr
  13947.     move.l    d1,d2
  13948.     bsr    skip_sep            *skip ','
  13949.     bsr    chk_num
  13950.     bmi    m_parameter_cannot_be_omitted    *値がない時はエラー
  13951.     move.b    (a4),d0
  13952.     moveq.l    #poke_zmd,d3            *zmd cmd
  13953.     cmpi.b    #'-',d0
  13954.     beq    @f
  13955.     cmpi.b    #'+',d0
  13956.     bne    do_get_data
  13957. @@:
  13958.     moveq.l    #rltv_poke_zmd,d3
  13959. do_get_data:
  13960.     bsr    get_num                *get data
  13961.  
  13962.     move.l    d3,d0
  13963.     bsr    do_wrt_trk_b
  13964.     cmpi.l    #255,d2
  13965.     bhi    @f
  13966.     moveq.l    #$00,d3            *mode
  13967.     lea    do_wrt_trk_b(pc),a1
  13968.     bra    get_poke_data
  13969. @@:
  13970.     cmpi.l    #65535,d2
  13971.     bhi    @f
  13972.     moveq.l    #$10,d3            *mode
  13973.     lea    do_wrt_trk_w(pc),a1
  13974.     bra    get_poke_data
  13975. @@:
  13976.     moveq.l    #$30,d3            *mode
  13977.     lea    do_wrt_trk_l(pc),a1
  13978. get_poke_data:
  13979.     cmpi.l    #255,d1
  13980.     bhi    @f
  13981.     lea    do_wrt_trk_b(pc),a2
  13982.     bra    do_wrt_poke
  13983. @@:
  13984.     cmpi.l    #65535,d1
  13985.     bhi    @f
  13986.     ori.b    #1,d3            *mode
  13987.     lea    do_wrt_trk_w(pc),a2
  13988.     bra    do_wrt_poke
  13989. @@:
  13990.     ori.b    #3,d3            *mode
  13991.     lea    do_wrt_trk_l(pc),a2
  13992. do_wrt_poke:
  13993.     move.l    d3,d0
  13994.     bsr    do_wrt_trk_b        *mode
  13995.     move.l    d2,d0
  13996.     jsr    (a1)            *addr
  13997.     move.l    d1,d0
  13998.     jsr    (a1)            *data
  13999.     tst.b    seq_cmd-work(a6)
  14000.     beq    mml_lp
  14001.     rts
  14002.  
  14003. mml_synchronize:        *[SYNCHRONIZE n]
  14004. mml_w:                *同期コマンド
  14005.     tas.b    compile_status-work(a6)    *MML Wを使用したことをマーク
  14006.     bsr    chk_num
  14007.     bmi    @f        *同期街コマンドとみなす
  14008.     bsr    get_num
  14009.     subq.l    #1,d1
  14010.     cmpi.l    #tr_max-1,d1
  14011.     bhi    m_illegal_track_number
  14012.     bsr    check_trk_no
  14013.     moveq.l    #send_sync_zmd,d0
  14014.     bsr    do_wrt_trk_b
  14015.     move.l    d1,d0
  14016.     bsr    reg_trkn        *トラック番号セット
  14017.     bsr    do_wrt_trk_w
  14018.     tst.b    seq_cmd-work(a6)
  14019.     beq    mml_lp
  14020.     rts
  14021. @@:
  14022.     moveq.l    #waiting_zmd,d0
  14023.     bsr    do_wrt_trk_b
  14024.     tst.b    seq_cmd-work(a6)
  14025.     beq    mml_lp
  14026.     rts
  14027.  
  14028. reg_trkn_ctrl:                *トラック番号再割り振り用情報登録(CTRL)
  14029.     * < d0.l=dest. trk n
  14030. reglist    reg    d0/d2/a0-a1
  14031.     movem.l    reglist,-(sp)
  14032.     move.l    trkn_now(pc),a1
  14033.     add.l    trkn_addr(pc),a1
  14034.     move.l    #1,(a1)+        *offset type 1=ctrl_addr
  14035.     move.l    ctrl_now(pc),(a1)+    *ctrl
  14036.     clr.l    (a1)+            *dummy
  14037.     move.l    d0,(a1)+        *set trk n
  14038.     bra    @f
  14039.  
  14040. reg_trkn:                *トラック番号再割り振り用情報登録(MML)
  14041.     * < d0.l=dest. trk n
  14042.     * < tpt_now(a5)
  14043.     movem.l    reglist,-(sp)
  14044.     move.l    trkn_now(pc),a1
  14045.     add.l    trkn_addr(pc),a1
  14046.     clr.l    (a1)+            *offset type 0=tpt_now
  14047.     move.l    tpt_now(a5),(a1)+    *set offset addr.
  14048.     move.l    a5,d2
  14049.     sub.l    trk_ptr_tbl-work(a6),d2
  14050.     move.l    d2,(a1)+        *set trk n's tpt offset addr.
  14051.     move.l    d0,(a1)+        *set trk n
  14052. @@:
  14053.     cmp.l    trkn_end(pc),a1
  14054.     bcs    @f            *no error
  14055.     move.l    trkn_addr(pc),a1
  14056.     move.l    trkn_size(pc),d2
  14057.     add.l    #ta_size*100,d2        *new size
  14058.     bsr    enlarge_mem
  14059.     tst.l    d0
  14060.     bmi    m_out_of_memory
  14061.     move.l    d2,trkn_size-work(a6)
  14062.     move.l    a0,trkn_addr-work(a6)
  14063.     add.l    a0,d2
  14064.     move.l    d2,trkn_end-work(a6)
  14065. @@:
  14066.     add.l    #ta_size,trkn_now-work(a6)
  14067.     movem.l    (sp)+,reglist
  14068.     rts
  14069.  
  14070. calc_gt_chd:            *ゲートタイムの計算
  14071.     move.b    v2_compatch-work(a6),-(sp)
  14072.     clr.b    v2_compatch-work(a6)
  14073.     bsr    calc_gt
  14074.     move.b    (sp)+,v2_compatch-work(a6)
  14075.     rts
  14076.  
  14077. calc_gt:            *ゲートタイムの計算
  14078.     * < d0.w=step time
  14079.     * > d0.w=gate time
  14080.     * - all
  14081. reglist    reg    d1-d3
  14082.     tst.w    d0
  14083.     beq    bye_calc_gt
  14084.     movem.l    reglist,-(sp)
  14085.     move.l    d0,d3        *backup
  14086.     move.w    tpt_gate_time(a5),d1
  14087.     bpl    case_normal_q
  14088.                 *case:@Q
  14089.     neg.w    d1
  14090.     btst.b    #c_q_sgn,tpt_mode_flg(a5)
  14091.     beq    @f
  14092.     add.w    d1,d0        *@Q-nの場合
  14093.     bcs    2f
  14094.     cmpi.w    #32767,d0
  14095.     bhi    2f
  14096.     bra    exit_cg
  14097. @@:                *@Q+nの場合
  14098.     btst.b    #c_@q,tpt_mode_flg(a5)
  14099.     bne    1f
  14100.     cmp.w    d0,d1
  14101.     bcc    exit_cg        *ゲートタイムが負 or 0になる時は計算しない
  14102.     sub.w    d1,d0
  14103.     bra    exit_cg
  14104. 1:                *ゲートタイム固定値ケース
  14105.     tst.b    v2_compatch-work(a6)
  14106.     bne    do_fxgt
  14107.     tst.b    fxgt_mode-work(a6)
  14108.     beq    @f        *fixed gatetimeの動作モードチェック
  14109. do_fxgt:
  14110.     cmp.w    d1,d3
  14111.     bcc    @f
  14112.     move.w    d3,d0        *gt>=stのときgt=stにしてしまう
  14113.     bra    exit_cg
  14114. @@:
  14115.     move.w    d1,d0
  14116.     bra    exit_cg
  14117. case_normal_q:            *Qケース
  14118.     move.l    d0,d2
  14119.     mulu    d1,d0
  14120.     move.b    gate_shift(pc),d1
  14121.     btst.b    #c_q_sgn,tpt_mode_flg(a5)
  14122.     beq    @f
  14123.     lsr.l    d1,d0        */gate range
  14124.     add.w    d2,d0
  14125.     bcs    2f
  14126.     cmpi.w    #32767,d0
  14127.     bhi    2f
  14128.     bra    exit_cg
  14129. 2:
  14130.     move.w    #32767,d0
  14131.     bra    exit_cg
  14132. @@:
  14133.     lsr.l    d1,d0        */gate range
  14134.     bne    exit_cg
  14135.     moveq.l    #1,d0        *0の場合は最小値1にしておく
  14136. exit_cg:
  14137.     movem.l    (sp)+,reglist
  14138. bye_calc_gt:
  14139.     rts
  14140.  
  14141. chk_oncho:            *音長があるかないか
  14142.     * < (a4)=data
  14143.     * > minus=not oncho
  14144.     * > eq=suji
  14145.     * X d0
  14146.     move.w    d0,-(sp)
  14147.     bsr    skip_spc
  14148.     cmp.l    a4,d4
  14149.     bls    not_oncho
  14150.     move.b    (a4),d0
  14151.     cmpi.b    #'0',d0
  14152.     bcs    chk_o0
  14153.     cmpi.b    #'9',d0
  14154.     bls    yes_oncho
  14155. chk_o0:
  14156.     cmpi.b    #'$',d0        *16進数指定
  14157.     beq    yes_oncho
  14158. not_oncho:
  14159.     move.w    (sp)+,d0
  14160.     move.w    #CCR_NEGA,ccr
  14161.     rts
  14162. yes_oncho:
  14163.     move.w    (sp)+,d0
  14164.     move.w    #CCR_ZERO,ccr
  14165.     rts
  14166.  
  14167. consider_trkfrq_gt:
  14168.     * < d0.w=step time
  14169.     * > d0.w=calclated step time
  14170.     cmpi.w    #TIE_GATE,d0
  14171.     beq    exit_csrtrfr
  14172. consider_trkfrq_st:
  14173.     * < d0.w=step time
  14174.     * > d0.w=calclated step time
  14175.     andi.l    #$ffff,d0        *もともとゼロは計算しない
  14176.     beq    exit_csrtrfr
  14177.     move.w    d1,-(sp)
  14178.     move.w    tpt_trkfrq(a5),d1
  14179.     beq    1f
  14180.     addq.w    #1,d1
  14181.     divu    d1,d0
  14182.     beq    m_error_in_division    *商が0はエラー
  14183.     swap    d0
  14184.     tst.w    d0
  14185.     beq    @f
  14186.     bsr    m_surplus_in_division    *余りが発生している
  14187. @@:
  14188.     swap    d0
  14189. 1:
  14190.     move.w    (sp)+,d1
  14191. exit_csrtrfr:
  14192.     rts
  14193.  
  14194. wave_form:                *.WAVE_FORM(波形メモリ設定登録)
  14195. *    bsr    check_relation_cmn    *コマンド関係チェック
  14196.     bsr    chk_num
  14197.     bmi    m_parameter_cannot_be_omitted
  14198.     moveq.l    #CMN_WAVE_FORM,d0
  14199.     bsr    do_wrt_cmn_b        *cmd code
  14200.     bsr    get_num            *get wave number
  14201.     cmpi.l    #wv_reg_max+8,d1
  14202.     bcc    m_illegal_wave_number    *32767より上はダメ
  14203.     cmpi.l    #8,d1
  14204.     bcs    m_illegal_wave_number    *7以下はプリセット波形
  14205.     move.l    d1,d0
  14206.     bsr    do_wrt_cmn_w        *set wave number
  14207.     moveq.l    #0,d0            *dummy
  14208.     bsr    do_wrt_cmn_l        *size.l
  14209.     bsr    do_wrt_cmn_b        *type.b
  14210.     bsr    do_wrt_cmn_l        *start.l
  14211.     bsr    do_wrt_cmn_l        *end.l
  14212.     bsr    do_wrt_cmn_l        *time.l
  14213.     bsr    do_wrt_cmn_l        *reserved
  14214.     bsr    chk_membdr_cmn        *一応、最低必要分メモリは確保
  14215.     move.l    zmd_now-work(a6),a0
  14216.     lea    -(4+1+4+4+4+4)(a0),a2    *a2=データ長格納先オフセットアドレス
  14217.     lea    -(0+1+4+4+4+4)(a0),a1
  14218.     add.l    zmd_addr-work(a6),a1    *a1=loop type格納アドレス
  14219.  
  14220.     bsr    skip_sep
  14221.     bsr    skip_spc
  14222.     moveq.l    #0,d1
  14223.     cmp.l    a4,d4
  14224.     bls    @f
  14225.     move.b    (a4),d0
  14226.     cmpi.b    #'1',d0
  14227.     bne    @f
  14228.     move.b    1(a4),d0
  14229.     bsr    mk_capital
  14230.     cmpi.b    #'S',d0
  14231.     beq    getlpnmstr
  14232. @@:
  14233.     bsr    chk_num
  14234.     bmi    getlpnmstr        *loop type省略
  14235.     bsr    get_num            *get loop type
  14236.     cmpi.l    #2,d1
  14237.     bhi    m_undefined_loop_type
  14238.     bra    1f
  14239. getlpnmstr:
  14240.     pea    (a1)
  14241.     lea    wvfm_name-work(a6),a1
  14242.     bsr    get_com_no
  14243.     move.l    (sp)+,a1
  14244.     bmi    1f
  14245.     move.l    d0,d1
  14246. 1:
  14247.     move.b    d1,(a1)+
  14248.  
  14249.     clr.b    wave_param_flg-work(a6)    *パラメータ省略フラグ初期化
  14250.     bsr    skip_sep
  14251.     moveq.l    #0,d1
  14252.     bsr    chk_num
  14253.     bmi    @f            *loop start point 省略
  14254.     bsr    get_num            *get loop start point
  14255.     add.l    d1,d1
  14256. @@:
  14257.     move.l    d1,d2            *後で適合性検査で使用
  14258.     rept    4
  14259.     rol.l    #8,d1
  14260.     move.b    d1,(a1)+
  14261.     endm
  14262.  
  14263.     bsr    skip_sep
  14264.     moveq.l    #0,d1
  14265.     bsr    chk_num
  14266.     bmi    @f            *loop end point 省略
  14267.     bsr    get_num            *get loop end point
  14268.     addq.l    #1,d1            *次をポイントするようにする
  14269.     add.l    d1,d1
  14270.     st    wave_param_flg-work(a6)
  14271.     cmp.l    d2,d1
  14272.     bcs    m_illegal_loop_end_point
  14273. @@:
  14274.     rept    4
  14275.     rol.l    #8,d1
  14276.     move.b    d1,(a1)+
  14277.     endm
  14278.  
  14279.     bsr    skip_sep
  14280.     moveq.l    #0,d1
  14281.     bsr    chk_num
  14282.     bmi    @f            *loop time 省略
  14283.     bsr    get_num            *get loop time
  14284. @@:
  14285.     rept    4
  14286.     rol.l    #8,d1
  14287.     move.b    d1,(a1)+
  14288.     endm
  14289.  
  14290.     rept    4            *reserved area
  14291.     clr.b    (a1)+
  14292.     endm
  14293.  
  14294.     jbsr    get_mdtr_str        *文字列取得、書き込み
  14295.  
  14296.     move.l    a0,d0
  14297.     andi.b    #1,d0
  14298.     beq    @f
  14299.     moveq.l    #0,d0
  14300.     bsr    do_wrt_cmn_b        *.evenに相当
  14301. @@:
  14302.     moveq.l    #0,d3            *data len
  14303. wvst_lp:
  14304.     bsr    skip_sep
  14305.     cmp.l    a4,d4
  14306.     bls    m_parameter_break_off    *パラメータが不足している
  14307.     bsr    chk_num
  14308.     bmi    exit_wvst        *データもう無し
  14309.     bsr    get_num
  14310.     move.l    d1,d0
  14311.     bpl    @f
  14312.     neg.l    d1
  14313. @@:
  14314.     cmpi.l    #$ffff,d1        *波形の振幅が16ビット範囲を超えていたらエラー
  14315.     bhi    m_illegal_wave_value
  14316.     bsr    do_wrt_cmn_w
  14317.     addq.l    #2,d3            *inc data len
  14318.     bra    wvst_lp
  14319. exit_wvst:
  14320.     tst.l    d3
  14321.     beq    m_parameter_shortage
  14322.     add.l    zmd_addr(pc),a2
  14323.     rept    4
  14324.     rol.l    #8,d3
  14325.     move.b    d3,(a2)+        *データ長を格納
  14326.     endm
  14327.     moveq.l    #0,d0            *default
  14328.     tst.b    wave_param_flg-work(a6)    *ループ終端省略されていたか
  14329.     bne    @f
  14330.     addq.w    #1,a2            *skip loop type
  14331.     rept    3
  14332.     move.b    (a2)+,d0
  14333.     lsl.l    #8,d0            *ループ開始オフセットを取得(後続の適合性検査で使用)
  14334.     endm
  14335.     move.b    (a2)+,d0
  14336.     rept    4
  14337.     rol.l    #8,d3
  14338.     move.b    d3,(a2)+        *ループ終端を設定
  14339.     endm
  14340. @@:
  14341.     cmp.l    d3,d0
  14342.     bcc    m_illegal_loop_start_point
  14343.     move.l    zmd_addr(pc),a1
  14344.     move.l    z_cmn_flag(a1),d0
  14345.     bset.l    #CMN_WAVE_FORM/4,d0
  14346.     move.l    d0,z_cmn_flag(a1)
  14347.     jmp    find_end
  14348.  
  14349. sc55_id_set:
  14350.     moveq.l    #ID_set_zmd,d0
  14351.     bsr    do_wrt_trk_b
  14352.     moveq.l    #$41,d0
  14353.     bsr    do_wrt_trk_b
  14354.     move.l    d2,d0            *device ID
  14355.     bsr    do_wrt_trk_b
  14356.     moveq.l    #$45,d0            *SC55
  14357.     bra    do_wrt_trk_b
  14358.  
  14359. gs_id_set:
  14360.     moveq.l    #ID_set_zmd,d0
  14361.     bsr    do_wrt_trk_b
  14362.     moveq.l    #$41,d0
  14363.     bsr    do_wrt_trk_b
  14364.     move.l    d2,d0            *device ID
  14365.     bsr    do_wrt_trk_b
  14366.     moveq.l    #$42,d0            *GS
  14367.     bra    do_wrt_trk_b
  14368.  
  14369. mt32_id_set:
  14370.     moveq.l    #ID_set_zmd,d0
  14371.     bsr    do_wrt_trk_b
  14372.     moveq.l    #$41,d0
  14373.     bsr    do_wrt_trk_b
  14374.     move.l    d2,d0            *device ID
  14375.     bsr    do_wrt_trk_b
  14376.     moveq.l    #$16,d0            *MT32
  14377.     bra    do_wrt_trk_b
  14378.  
  14379. u220_id_set:
  14380.     moveq.l    #ID_set_zmd,d0
  14381.     bsr    do_wrt_trk_b
  14382.     moveq.l    #$41,d0
  14383.     bsr    do_wrt_trk_b
  14384.     move.l    d2,d0            *device ID
  14385.     bsr    do_wrt_trk_b
  14386.     moveq.l    #$2b,d0            *U220
  14387.     bra    do_wrt_trk_b
  14388.  
  14389. mml_gs_reset:                *[GS_RESET]
  14390.     moveq.l    #$10,d1            *omitted case value
  14391.     bsr    get_devid_ifn        *>d2=DEV ID
  14392.     bsr    gs_id_set
  14393.     moveq.l    #exclusive_zmd,d0
  14394.     bsr    do_wrt_trk_b
  14395.     moveq.l    #MKID_ROLAND,d0
  14396.     bsr    do_wrt_trk_b
  14397.     moveq.l    #8,d1
  14398.     lea    sct_gs_reset(pc),a1
  14399.     lea    do_wrt_trk_b(pc),a2
  14400.     bsr    wrt_comment
  14401.     moveq.l    #4,d0
  14402.     bsr    do_wrt_trk_l        *データ長
  14403.     move.l    #$40007f_00,d0
  14404.     bra    do_wrt_trk_l        *転送データ
  14405.  
  14406. gs_reset:                *.GS_RESET(.SC55_INIT)
  14407. *    bsr    check_relation_cmn    *コマンド関係チェック
  14408.     moveq.l    #CMN_MIDI_TRANSMISSION,d0
  14409.     bsr    do_wrt_cmn_b
  14410.     moveq.l    #$10,d1            *omitted case value
  14411.     bsr    get_devid_ifn        *d1=I/F number,d2=DEV ID
  14412.     move.l    d1,d0
  14413.     bsr    do_wrt_cmn_b        *I/F number
  14414.     moveq.l    #8,d1
  14415.     lea    sct_gs_reset(pc),a1
  14416.     lea    do_wrt_cmn_b(pc),a2
  14417.     bsr    wrt_comment
  14418.     moveq.l    #11,d0
  14419.     bsr    do_wrt_cmn_l        *データ長
  14420.     lea    header(pc),a1        *送信パック作成
  14421.     move.b    d2,2(a1)
  14422.     move.b    #$42,3(a1)
  14423.     move.b    #$40,5(a1)
  14424.     move.l    #$007f0041,6(a1)
  14425.     moveq.l    #11-1,d1
  14426. @@:                    *データ本体の書き込み
  14427.     move.b    (a1)+,d0
  14428.     bsr    do_wrt_cmn_b
  14429.     dbra    d1,@b
  14430.     jmp    cmpl_lp
  14431.  
  14432. get_bk_pg_devid_ifn:    *バンク番号、音色番号とデバイスIDとインターフェース番号の取得
  14433.     * > d1.b-I/F number(0-2,-1)
  14434.     * > d2.b=DEVICE ID(0-127)
  14435.     * > d3.hw=bank number(0,1)
  14436.     * > d3.lw=pgm number(0-127)
  14437.     * - all
  14438.     bsr    chk_num
  14439.     bmi    m_parameter_cannot_be_omitted    *マップナンバーの省略はできない
  14440.     bsr    get_num
  14441.     cmpi.l    #1,d1
  14442.     bhi    m_illegal_map_number
  14443.     move.l    d1,d3
  14444.     swap    d3
  14445.  
  14446.     bsr    skip_sep
  14447.  
  14448.     bsr    chk_num
  14449.     bmi    m_parameter_cannot_be_omitted    *パートナンバーの省略はできない
  14450.     bsr    get_num                *1-128
  14451.     subq.l    #1,d1
  14452.     cmpi.l    #127,d1
  14453.     bhi    m_illegal_note_number
  14454.     move.w    d1,d3
  14455.     bsr    skip_sep
  14456.     moveq.l    #$10,d1            *omitted case value
  14457.     bra    get_devid_ifn
  14458.  
  14459. get_mp_ky_devid_ifn:    *マップ番号、キー番号とデバイスIDとインターフェース番号の取得
  14460.     * > d1.b-I/F number(0-2,-1)
  14461.     * > d2.b=DEVICE ID(0-127)
  14462.     * > d3.hw=map number(0,1)
  14463.     * > d3.lw=key number(0-127)
  14464.     * - all
  14465.     bsr    chk_num
  14466.     bmi    m_parameter_cannot_be_omitted    *マップナンバーの省略はできない
  14467.     bsr    get_num
  14468.     cmpi.l    #1,d1
  14469.     bhi    m_illegal_map_number
  14470.     move.l    d1,d3
  14471.     swap    d3
  14472.  
  14473.     bsr    skip_sep
  14474.  
  14475.     bsr    chk_num
  14476.     bmi    m_parameter_cannot_be_omitted    *パートナンバーの省略はできない
  14477.     bsr    get_num
  14478.     cmpi.l    #127,d1
  14479.     bhi    m_illegal_note_number
  14480.     move.w    d1,d3
  14481.     bsr    skip_sep
  14482.     moveq.l    #$10,d1            *omitted case value
  14483.     bra    get_devid_ifn
  14484.  
  14485. get_tm_pt_devid_ifn:    *ティンバー番号、パーシャル番号とデバイスIDとインターフェース番号の取得
  14486.     * > d1.b-I/F number(0-2,-1)
  14487.     * > d2.b=DEVICE ID(0-127)
  14488.     * > d3.hw=timbre number(0-63)
  14489.     * > d3.lw=key number(0-3)
  14490.     * - all
  14491.     bsr    chk_num
  14492.     bmi    m_parameter_cannot_be_omitted    *マップナンバーの省略はできない
  14493.     bsr    get_num
  14494.     subq.l    #1,d1
  14495.     cmpi.l    #63,d1
  14496.     bhi    m_illegal_timbre_number
  14497.     move.l    d1,d3
  14498.     swap    d3
  14499.  
  14500.     bsr    skip_sep
  14501.  
  14502.     bsr    chk_num
  14503.     bmi    m_parameter_cannot_be_omitted    *パートナンバーの省略はできない
  14504.     bsr    get_num
  14505.     subq.l    #1,d1
  14506.     cmpi.l    #3,d1
  14507.     bhi    m_illegal_partial_number
  14508.     move.w    d1,d3
  14509.     bsr    skip_sep
  14510.     moveq.l    #$10,d1            *omitted case value
  14511.     bra    get_devid_ifn
  14512.  
  14513. get_tm_devid_ifn:        *ティンバー番号とデバイスIDとインターフェース番号の取得
  14514.     * > d1.b=I/F number(0-2,-1)
  14515.     * > d2.b=DEVICE ID(0-127)
  14516.     * > d3.b=timbre number(0-63)
  14517.     * - all
  14518.     bsr    chk_num
  14519.     bmi    m_parameter_cannot_be_omitted    *パートナンバーの省略はできない
  14520.     bsr    get_num
  14521.     subq.l    #1,d1
  14522.     cmpi.l    #63,d1
  14523.     bhi    m_illegal_timbre_number
  14524.     move.w    d1,d3
  14525.  
  14526.     bsr    skip_sep
  14527.     moveq.l    #$10,d1            *omitted case value
  14528.     bra    get_devid_ifn
  14529.  
  14530. get_map_devid_ifn:        *マップ番号とデバイスIDとインターフェース番号の取得
  14531.     * > d1.b=I/F number(0-2,-1)
  14532.     * > d2.b=DEVICE ID(0-127)
  14533.     * > d3.b=map number(-128~127)
  14534.     * - all
  14535.     bsr    chk_num
  14536.     bpl    @f
  14537.     lea    sc88_drmmap_strv-work(a6),a1
  14538.     bsr    get_com_no
  14539.     bmi    m_illegal_map_number
  14540.     tas.b    d0
  14541.     move.w    d0,d3
  14542.     bra    1f
  14543. @@:
  14544.     bsr    get_num
  14545.     cmpi.l    #1,d1
  14546.     bhi    m_illegal_map_number
  14547.     move.w    d1,d3            *map number=0,1
  14548. 1:
  14549.     bsr    skip_sep
  14550.     moveq.l    #$10,d1            *omitted case value
  14551.     bra    get_devid_ifn
  14552.  
  14553. get_ptch_devid_ifn:            *パッチ番号とデバイスIDとインターフェース番号の取得
  14554.     * > d1.b=I/F number(0-2,-1)
  14555.     * > d2.b=DEVICE ID(0-127)
  14556.     * > d3.b=timbre number(0-127)
  14557.     * - all
  14558.     bsr    chk_num
  14559.     bmi    m_parameter_cannot_be_omitted    *パートナンバーの省略はできない
  14560.     bsr    get_num
  14561.     subq.l    #1,d1
  14562.     cmpi.l    #127,d1
  14563.     bhi    m_illegal_patch_number
  14564.     move.w    d1,d3
  14565.  
  14566.     bsr    skip_sep
  14567.     moveq.l    #$10,d1            *omitted case value
  14568.     bra    get_devid_ifn
  14569.  
  14570. get_tmb_devid_ifn:            *TIMBRE番号とデバイスIDとインターフェース番号の取得
  14571.     * > d1.b=I/F number(0-2,-1)
  14572.     * > d2.b=DEVICE ID(0-127)
  14573.     * > d3.b=timbre number(0-127)
  14574.     * - all
  14575.     bsr    chk_num
  14576.     bmi    m_parameter_cannot_be_omitted    *パートナンバーの省略はできない
  14577.     bsr    get_num
  14578.     subq.l    #1,d1
  14579.     cmpi.l    #127,d1
  14580.     bhi    m_illegal_timbre_number
  14581.     move.w    d1,d3
  14582.  
  14583.     bsr    skip_sep
  14584.     moveq.l    #$10,d1            *omitted case value
  14585.     bra    get_devid_ifn
  14586.  
  14587. get_ky_devid_ifn:            *キー番号とデバイスIDとインターフェース番号の取得
  14588.     * > d1.b=I/F number(0-2,-1)
  14589.     * > d2.b=DEVICE ID(0-127)
  14590.     * > d3.b=key(0-127)
  14591.     * - all
  14592.     bsr    chk_num
  14593.     bmi    m_parameter_cannot_be_omitted    *パートナンバーの省略はできない
  14594.     bsr    get_num
  14595.     cmpi.l    #87,d1
  14596.     bhi    m_illegal_note_number
  14597.     sub.l    #24,d1
  14598.     bmi    m_illegal_note_number
  14599.     move.w    d1,d3
  14600.  
  14601.     bsr    skip_sep
  14602.     moveq.l    #$10,d1            *omitted case value
  14603.     bra    get_devid_ifn
  14604.  
  14605. get_nt_devid_ifn:        *ノート番号とデバイスIDとインターフェース番号の取得
  14606.     * > d1.b=I/F number(0-2,-1)
  14607.     * > d2.b=DEVICE ID(0-127)
  14608.     * > d3.b=note(0-127)
  14609.     * - all
  14610.     bsr    chk_num
  14611.     bmi    m_parameter_cannot_be_omitted    *パートナンバーの省略はできない
  14612.     bsr    get_num
  14613.     cmpi.l    #99,d1
  14614.     bhi    m_illegal_note_number
  14615.     cmpi.l    #35,d1
  14616.     bcs    m_illegal_note_number
  14617.     move.w    d1,d3
  14618.  
  14619.     bsr    skip_sep
  14620.     moveq.l    #$10,d1            *omitted case value
  14621.     bra    get_devid_ifn
  14622.  
  14623. get_mode_devid_ifn:            *モード値、デバイスIDとインターフェース番号の取得
  14624.     * > d1.b=I/F number(0-2,-1)
  14625.     * > d2.b=DEVICE ID(0-127)
  14626.     * > d3.b=mode(0,1)
  14627.     * - all
  14628.     bsr    chk_num
  14629.     bmi    m_parameter_cannot_be_omitted    *モード番号の省略はできない
  14630.     bsr    get_num
  14631.     subq.l    #1,d1
  14632.     cmpi.l    #1,d1
  14633.     bhi    m_illegal_mode_value
  14634.     move.w    d1,d3
  14635.  
  14636.     bsr    skip_sep
  14637.     moveq.l    #$10,d1            *omitted case value
  14638.     bra    get_devid_ifn
  14639.  
  14640. get_pt_devid_ifn:            *パート番号とデバイスIDとインターフェース番号の取得
  14641.     * > d1.b=I/F number(0-2,-1)
  14642.     * > d2.b=DEVICE ID(0-127)
  14643.     * > d3.b=part number(0-5)
  14644.     * - all
  14645.     bsr    chk_num
  14646.     bmi    m_parameter_cannot_be_omitted    *パートナンバーの省略はできない
  14647.     bsr    get_num
  14648.     subq.l    #1,d1
  14649.     cmpi.l    #5,d1
  14650.     bhi    m_illegal_part_number
  14651.     move.w    d1,d3
  14652.  
  14653.     bsr    skip_sep
  14654.     moveq.l    #$10,d1            *omitted case value
  14655.     bra    get_devid_ifn
  14656.  
  14657. get_prt_devid_ifn:            *パート番号とデバイスIDとインターフェース番号の取得
  14658.     * > d1.b=I/F number(0-2,-1)
  14659.     * > d2.b=DEVICE ID(0-127)
  14660.     * > d3.b=part number(1-16)
  14661.     * - all
  14662.     bsr    chk_num
  14663.     bmi    m_parameter_cannot_be_omitted    *パートナンバーの省略はできない
  14664.     bsr    get_num
  14665.     tst.l    d1
  14666.     beq    m_illegal_part_number
  14667.     cmpi.l    #16,d1
  14668.     bhi    m_illegal_part_number
  14669.     move.w    d1,d3
  14670.  
  14671.     bsr    skip_sep
  14672.     moveq.l    #$10,d1            *omitted case value
  14673. get_devid_ifn:                *デバイスIDとインターフェース番号の取得
  14674.     * < d1.l=default device ID
  14675.     * > d1.b-I/F number(0-2,-1)
  14676.     * > d2.b=DEVICE ID(0-127)
  14677.     * - all
  14678.     bsr    chk_num
  14679.     bmi    @f
  14680.     bsr    get_num
  14681.     cmpi.l    #127,d1
  14682.     bhi    m_illegal_device_id    *デバイスIDが異常です
  14683. @@:
  14684.     move.l    d1,d2
  14685.     bsr    skip_sep
  14686. get_ifn:
  14687.     * > d1.b-I/F number(0-2,-1)
  14688.     tst.b    now_cmd-work(a6)    *MML系コマンドにはインターフェース番号は無関係
  14689.     bpl    @f
  14690.     moveq.l    #-1,d1            *current midi out
  14691.     bsr    chk_num
  14692.     bmi    @f
  14693.     bsr    get_num
  14694.     subq.l    #1,d1                *0-2
  14695.     cmpi.l    #if_max-1,d1
  14696.     bhi    m_illegal_interface_number
  14697. @@:
  14698.     rts
  14699.  
  14700. wrt_comment:
  14701.     * < d1.l=len of comment
  14702.     * < a1.l=コメント内容
  14703.     * < a2.l=書き込みルーチンエントリアドレス
  14704.     * X d0-d1/a1
  14705.     tst.b    auto_comment-work(a6)    *自動コメント生成モードか
  14706.     beq    gsrst_nocmt
  14707.     move.l    d1,d0
  14708.     jsr    (a2)        *write str len
  14709.     subq.w    #1,d1
  14710.     bcs    exit_wrtcmt
  14711. @@:
  14712.     move.b    (a1)+,d0
  14713.     jsr    (a2)        *文字列'GS_RESET'を書き込む
  14714.     dbra    d1,@b
  14715. exit_wrtcmt:
  14716.     rts
  14717. gsrst_nocmt:
  14718.     moveq.l    #0,d0        *コメントなしならばコメント長=0を
  14719.     jmp    (a2)        *設定して帰還
  14720.  
  14721. mml_gs_partial_reserve:                *[GS_PARTIAL_RESERVE]
  14722.     moveq.l    #$10,d1            *omitted case value
  14723.     bsr    get_devid_ifn        *>d2=DEV ID
  14724.     bsr    gs_id_set
  14725.     moveq.l    #exclusive_zmd,d0
  14726.     bsr    do_wrt_trk_b
  14727.     moveq.l    #MKID_ROLAND,d0
  14728.     bsr    do_wrt_trk_b
  14729.     moveq.l    #18,d1
  14730.     lea    sct_gs_v_rsv(pc),a1
  14731.     lea    do_wrt_trk_b(pc),a2
  14732.     bsr    wrt_comment        *コメント書き出し
  14733.     bsr    do_gsptlrsv        *送信パケット生成
  14734.     moveq.l    #3+16,d0
  14735.     bsr    do_wrt_trk_l        *データ長
  14736.     move.l    temp_buffer(pc),a1
  14737.     addq.w    #5,a1
  14738.     moveq.l    #3+16-1,d1
  14739. @@:
  14740.     move.b    (a1)+,d0
  14741.     bsr    do_wrt_trk_b
  14742.     dbra    d1,@b
  14743.     rts
  14744.  
  14745. gs_partial_reserve:                *.GS_PARTIAL_RESERVE,.SC55_V_RESERVE(SC55ボイスリザーブ)
  14746. *    bsr    check_relation_cmn    *コマンド関係チェック
  14747.     moveq.l    #CMN_MIDI_TRANSMISSION,d0
  14748.     bsr    do_wrt_cmn_b
  14749.     moveq.l    #$10,d1            *omitted case value
  14750.     bsr    get_devid_ifn        *d1=I/F number,d2=DEV ID
  14751.     move.l    d1,d0
  14752.     bsr    do_wrt_cmn_b        *I/F number
  14753.     moveq.l    #18,d1
  14754.     lea    sct_gs_v_rsv(pc),a1
  14755.     lea    do_wrt_cmn_b(pc),a2
  14756.     bsr    wrt_comment        *コメント書き出し
  14757.     bsr    do_gsptlrsv        *送信パケット生成
  14758.     move.l    #8+16+2,d0
  14759.     bsr    do_wrt_cmn_l        *データ長
  14760.     move.l    temp_buffer(pc),a1
  14761.     moveq.l    #8+16+2-1,d1
  14762. @@:
  14763.     move.b    (a1)+,d0
  14764.     bsr    do_wrt_cmn_b
  14765.     dbra    d1,@b
  14766.     jmp    cmpl_lp
  14767.  
  14768. do_gsptlrsv:                *GSパーシャルリザーブパラメータ取得&MIDIメッセージ作成
  14769.     * < d2=DEV ID
  14770.     * > temp_buffer
  14771.     * x d0-d3/a1-a2
  14772.     move.l    temp_buffer(pc),a2
  14773.     move.w    #$f041,(a2)+
  14774.     move.b    d2,(a2)+        *set dev ID
  14775.     move.b    #$42,(a2)+        *set model id
  14776.     move.l    #$12_400110,(a2)+    *cmd,addr
  14777.     moveq.l    #16,d1
  14778.     suba.l    a1,a1
  14779.     bsr    get_arry_params        *{...}で囲まれた数値の取得 (< d1 n of data/> d1=n of data)
  14780.     subq.l    #1,d1
  14781.     cmpi.l    #15,d1
  14782.     bne    m_illegal_parameter_format    *パラメータは必ず16個
  14783.     move.l    arry_stock(pc),a1
  14784.     move.b    9(a1),d3
  14785.     move.b    d3,(a2)+        *copy part 10
  14786.     add.b    #$40+$01+$10,d3
  14787.     moveq.l    #9-1,d1
  14788. @@:
  14789.     move.b    (a1)+,d0
  14790.     add.b    d0,d3
  14791.     move.b    d0,(a2)+    *copy part 1 to 9
  14792.     dbra    d1,@b
  14793.     addq.w    #1,a1        *skip part 10
  14794.     moveq.l    #6-1,d1
  14795. @@:
  14796.     move.b    (a1)+,d0
  14797.     add.b    d0,d3
  14798.     move.b    d0,(a2)+    *copy part 11 to 16
  14799.     dbra    d1,@b
  14800.     bra    calcset_exsm
  14801.  
  14802. get_arry_params:                *データ列認識
  14803.     * < d1.l=required n of data(この個数よりも少なかった場合は0で埋める/多かったらエラー)
  14804.     * < a1.l=limit value table
  14805.     * > arry_stock
  14806.     * > d1.l=usable n of data
  14807.     movem.l    d2-d3/d5-d6/a1-a2,-(sp)
  14808.     moveq.l    #0,d5                *default min
  14809.     moveq.l    #127,d6                *default max
  14810.     move.l    d1,d2
  14811.     move.l    arry_stock(pc),a2
  14812.     bsr    chk_num
  14813.     bpl    @f
  14814.     bsr    skip_eq
  14815.     cmp.l    a4,d4
  14816.     bls    m_parameter_cannot_be_omitted
  14817.     cmpi.b    #'{',(a4)+
  14818.     seq    d3                *終端マーク
  14819.     bne    m_parameter_cannot_be_omitted
  14820.     bsr    chk_num
  14821.     bmi    m_parameter_cannot_be_omitted
  14822. gtarprm_lp:
  14823.     moveq.l    #0,d1                *省略時の値
  14824.     bsr    chk_num
  14825.     bpl    @f
  14826.     cmp.l    a4,d4
  14827.     bls    exit_gtarprm_lp
  14828.     cmpi.b    #',',(a4)        *','の場合は値省略とする
  14829.     beq    gtarprm_nmldt
  14830.     bra    exit_gtarprm_lp        *','以外のものがあるという事はもう数値は
  14831. @@:                    *続かないという事
  14832.     bsr    get_num
  14833.     move.l    a1,d0
  14834.     beq    1f                *no check
  14835.     cmpi.b    #-1,(a1)            *min check
  14836.     beq    @f
  14837.     move.b    (a1)+,d5
  14838. @@:
  14839.     cmp.l    d5,d1
  14840.     bcs    m_illegal_parameter_value
  14841. 1:
  14842.     move.l    a1,d0
  14843.     beq    1f                *no check
  14844.     cmpi.b    #-1,(a1)            *max check
  14845.     beq    @f
  14846.     move.b    (a1)+,d6
  14847. @@:
  14848.     cmp.l    d6,d1
  14849.     bhi    m_illegal_parameter_value
  14850.     bsr    skip_sep
  14851. 1:
  14852. gtarprm_nmldt:
  14853.     bsr    skip_sep
  14854.     subq.l    #1,d2
  14855.     bcs    m_too_many_parameters        *パラメータが指定個数以上あってはならない
  14856.     move.b    d1,(a2)+
  14857.     bra    gtarprm_lp
  14858. exit_gtarprm_lp:
  14859.     move.l    a2,d1
  14860.     sub.l    arry_stock(pc),d1        *実質パラメータ個数
  14861.     tst.l    d2
  14862.     beq    exit_gtarprm
  14863. @@:                        *足りないパラメータは0で埋める
  14864.     clr.b    (a2)+
  14865.     subq.l    #1,d2
  14866.     bne    @b
  14867. exit_gtarprm:
  14868.     tst.b    d3                *終端括弧いらないケース=0
  14869.     beq    @f
  14870.     cmpi.b    #'}',(a4)+
  14871.     bne    m_illegal_command_line        *終端記号が無い
  14872. @@:
  14873.     movem.l    (sp)+,d2-d3/d5-d6/a1-a2
  14874.     rts
  14875.  
  14876. mml_gs_reverb:                *[GS_REVERB]([SC55_REVERB])
  14877.     moveq.l    #$10,d1            *omitted case value
  14878.     bsr    get_devid_ifn        *>d2=DEV ID
  14879.     bsr    gs_id_set
  14880.     moveq.l    #exclusive_zmd,d0
  14881.     bsr    do_wrt_trk_b
  14882.     moveq.l    #MKID_ROLAND,d0
  14883.     bsr    do_wrt_trk_b
  14884.     moveq.l    #9,d1
  14885.     lea    sct_gs_reverb(pc),a1
  14886.     lea    do_wrt_trk_b(pc),a2
  14887.     bsr    wrt_comment        *コメント書き出し
  14888.     bsr    do_gsrvb        *送信パケット生成 > d1.l=packet length
  14889. set_rdexml:
  14890.     subq.w    #7,d1            *header:5,tail:1,Without Checksum:1
  14891.     bcs    m_parameter_cannot_be_omitted    *パラメータは最低1個
  14892.     move.l    d1,d0
  14893.     bsr    do_wrt_trk_l        *データ長
  14894.     move.l    temp_buffer(pc),a1
  14895.     addq.w    #5,a1
  14896.     subq.w    #1,d1            *for dbra
  14897.     bcs    m_parameter_cannot_be_omitted    *パラメータは最低1個
  14898. @@:
  14899.     move.b    (a1)+,d0
  14900.     bsr    do_wrt_trk_b
  14901.     dbra    d1,@b
  14902.     rts
  14903.  
  14904. gs_reverb:                *.GS_REVERB(SC55_REVERB)
  14905. *    bsr    check_relation_cmn    *コマンド関係チェック
  14906.     moveq.l    #CMN_MIDI_TRANSMISSION,d0
  14907.     bsr    do_wrt_cmn_b
  14908.     moveq.l    #$10,d1            *omitted case value
  14909.     bsr    get_devid_ifn        *d1=I/F number,d2=DEV ID
  14910.     move.l    d1,d0
  14911.     bsr    do_wrt_cmn_b        *I/F number
  14912.     moveq.l    #9,d1
  14913.     lea    sct_gs_reverb(pc),a1
  14914.     lea    do_wrt_cmn_b(pc),a2
  14915.     bsr    wrt_comment        *コメント書き出し
  14916.     bsr    do_gsrvb        *送信パケット生成 > d1.l=packet length
  14917. set_rdexshp:
  14918.     move.l    d1,d0
  14919.     bsr    do_wrt_cmn_l        *データ長
  14920.     move.l    temp_buffer(pc),a1
  14921.     subq.w    #1,d1            *for dbra
  14922.     bcs    m_parameter_cannot_be_omitted    *パラメータは最低1個
  14923. @@:
  14924.     move.b    (a1)+,d0
  14925.     bsr    do_wrt_cmn_b
  14926.     dbra    d1,@b
  14927.     jmp    cmpl_lp
  14928.  
  14929. do_gsrvb:                *GSリバーブパラメータ取得&MIDIメッセージ作成
  14930.     * < d2=DEV ID
  14931.     * > temp_buffer
  14932.     * > d1=packet length(1~)
  14933.     * x d0-d3/a1-a2
  14934.     move.l    temp_buffer(pc),a2
  14935.     move.w    #$f041,(a2)+
  14936.     move.b    d2,(a2)+        *set dev ID
  14937.     move.b    #$42,(a2)+        *set model id
  14938.     move.l    #$12_400130,(a2)+    *cmd,addr
  14939.     moveq.l    #7,d1
  14940.     lea    gsrvb_lmit(pc),a1
  14941.     bsr    get_arry_params        *{}で囲まれた数値の取得(< d1 n of data/> d1=n of data)
  14942.     subq.l    #1,d1
  14943.     bcs    m_parameter_cannot_be_omitted    *パラメータは最低1個
  14944.     moveq.l    #$40+$01+$30,d3
  14945.     bra    set_arry_data
  14946.  
  14947. gsrvb_lmit:    dc.b    0,7,0,7,0,7,0,127,-1
  14948.     .even
  14949.  
  14950. mml_sc88_reverb:            *[SC88_REVERB]
  14951.     moveq.l    #$10,d1            *omitted case value
  14952.     bsr    get_devid_ifn        *>d2=DEV ID
  14953.     bsr    gs_id_set
  14954.     moveq.l    #exclusive_zmd,d0
  14955.     bsr    do_wrt_trk_b
  14956.     moveq.l    #MKID_ROLAND,d0
  14957.     bsr    do_wrt_trk_b
  14958.     moveq.l    #11,d1
  14959.     lea    sct_sc88_reverb(pc),a1
  14960.     lea    do_wrt_trk_b(pc),a2
  14961.     bsr    wrt_comment        *コメント書き出し
  14962.     bsr    do_sc88rvb        *送信パケット生成 > d1.l=packet length
  14963.     bra    set_rdexml
  14964.  
  14965. sc88_reverb:                *.SC88_REVERB
  14966. *    bsr    check_relation_cmn    *コマンド関係チェック
  14967.     moveq.l    #CMN_MIDI_TRANSMISSION,d0
  14968.     bsr    do_wrt_cmn_b
  14969.     moveq.l    #$10,d1            *omitted case value
  14970.     bsr    get_devid_ifn        *d1=I/F number,d2=DEV ID
  14971.     move.l    d1,d0
  14972.     bsr    do_wrt_cmn_b        *I/F number
  14973.     moveq.l    #11,d1
  14974.     lea    sct_sc88_reverb(pc),a1
  14975.     lea    do_wrt_cmn_b(pc),a2
  14976.     bsr    wrt_comment        *コメント書き出し
  14977.     bsr    do_sc88rvb        *送信パケット生成 > d1.l=packet length
  14978.     bra    set_rdexshp
  14979.  
  14980. do_sc88rvb:                *SC88リバーブパラメータ取得&MIDIメッセージ作成
  14981.     * < d2=DEV ID
  14982.     * > temp_buffer
  14983.     * > d1=packet length(1~)
  14984.     * x d0-d3/a1-a2
  14985.     move.l    temp_buffer(pc),a2
  14986.     move.w    #$f041,(a2)+
  14987.     move.b    d2,(a2)+        *set dev ID
  14988.     move.b    #$42,(a2)+        *set model id
  14989.     move.l    #$12_400130,(a2)+    *cmd,addr
  14990.     moveq.l    #8,d1
  14991.     lea    sc88rvb_lmit(pc),a1
  14992.     bsr    get_arry_params        *{}で囲まれた数値の取得(< d1 n of data/> d1=n of data)
  14993.     subq.l    #1,d1
  14994.     bcs    m_parameter_cannot_be_omitted    *パラメータは最低1個
  14995.     moveq.l    #$40+$01+$30,d3
  14996.     bra    set_arry_data
  14997.  
  14998. sc88rvb_lmit:    dc.b    0,7,0,7,0,7,0,127,-1
  14999.     .even
  15000.  
  15001. mml_gs_chorus:                *[GS_CHORUS]([SC55_CHORUS])
  15002.     moveq.l    #$10,d1            *omitted case value
  15003.     bsr    get_devid_ifn        *>d2=DEV ID
  15004.     bsr    gs_id_set
  15005.     moveq.l    #exclusive_zmd,d0
  15006.     bsr    do_wrt_trk_b
  15007.     moveq.l    #MKID_ROLAND,d0
  15008.     bsr    do_wrt_trk_b
  15009.     moveq.l    #9,d1
  15010.     lea    sct_gs_chorus(pc),a1
  15011.     lea    do_wrt_trk_b(pc),a2
  15012.     bsr    wrt_comment        *コメント書き出し
  15013.     bsr    do_gschrs        *送信パケット生成 > d1.l=packet length
  15014.     bra    set_rdexml
  15015.  
  15016. gs_chorus:                *.GS_CHORUS(SC55_CHORUS)
  15017. *    bsr    check_relation_cmn    *コマンド関係チェック
  15018.     moveq.l    #CMN_MIDI_TRANSMISSION,d0
  15019.     bsr    do_wrt_cmn_b
  15020.     moveq.l    #$10,d1            *omitted case value
  15021.     bsr    get_devid_ifn        *d1=I/F number,d2=DEV ID
  15022.     move.l    d1,d0
  15023.     bsr    do_wrt_cmn_b        *I/F number
  15024.     moveq.l    #9,d1
  15025.     lea    sct_gs_chorus(pc),a1
  15026.     lea    do_wrt_cmn_b(pc),a2
  15027.     bsr    wrt_comment        *コメント書き出し
  15028.     bsr    do_gschrs        *送信パケット生成 > d1.l=packet length
  15029.     bra    set_rdexshp
  15030.  
  15031. do_gschrs:                *GSコーラスパラメータ取得&MIDIメッセージ作成
  15032.     * < d2=DEV ID
  15033.     * > temp_buffer
  15034.     * > d1=packet length(1~)
  15035.     * x d0-d3/a1-a2
  15036.     move.l    temp_buffer(pc),a2
  15037.     move.w    #$f041,(a2)+
  15038.     move.b    d2,(a2)+        *set dev ID
  15039.     move.b    #$42,(a2)+        *set model id
  15040.     move.l    #$12_400138,(a2)+    *cmd,addr
  15041.     moveq.l    #8,d1
  15042.     lea    gschrs_limit(pc),a1
  15043.     bsr    get_arry_params        *{}で囲まれた数値の取得(< d1 n of data/> d1=n of data)
  15044.     subq.l    #1,d1
  15045.     bcs    m_parameter_cannot_be_omitted    *パラメータは最低1個
  15046.     moveq.l    #$40+$01+$38,d3
  15047. set_arry_data:
  15048.     * < d1.w=n of length-1
  15049.     move.l    arry_stock(pc),a1
  15050. @@:
  15051.     move.b    (a1)+,d0
  15052.     add.b    d0,d3
  15053.     move.b    d0,(a2)+
  15054.     dbra    d1,@b
  15055. calcset_exsm:
  15056.     moveq.l    #$80,d0
  15057.     andi.b    #$7f,d3
  15058.     sub.b    d3,d0
  15059.     andi.b    #$7f,d0
  15060.     move.b    d0,(a2)+    *checksum
  15061.     move.b    #$f7,(a2)+    *EOX
  15062.     move.l    a2,d1
  15063.     sub.l    temp_buffer(pc),d1
  15064.     rts
  15065.  
  15066. gschrs_limit:    dc.b    0,7,0,127,-1
  15067.     .even
  15068.  
  15069. mml_sc88_chorus:            *[SC88_CHORUS]
  15070.     moveq.l    #$10,d1            *omitted case value
  15071.     bsr    get_devid_ifn        *>d2=DEV ID
  15072.     bsr    gs_id_set
  15073.     moveq.l    #exclusive_zmd,d0
  15074.     bsr    do_wrt_trk_b
  15075.     moveq.l    #MKID_ROLAND,d0
  15076.     bsr    do_wrt_trk_b
  15077.     moveq.l    #11,d1
  15078.     lea    sct_sc88_chorus(pc),a1
  15079.     lea    do_wrt_trk_b(pc),a2
  15080.     bsr    wrt_comment        *コメント書き出し
  15081.     bsr    do_sc88chrs        *送信パケット生成 > d1.l=packet length
  15082.     bra    set_rdexml
  15083.  
  15084. sc88_chorus:                *.SC88_CHORUS
  15085. *    bsr    check_relation_cmn    *コマンド関係チェック
  15086.     moveq.l    #CMN_MIDI_TRANSMISSION,d0
  15087.     bsr    do_wrt_cmn_b
  15088.     moveq.l    #$10,d1            *omitted case value
  15089.     bsr    get_devid_ifn        *d1=I/F number,d2=DEV ID
  15090.     move.l    d1,d0
  15091.     bsr    do_wrt_cmn_b        *I/F number
  15092.     moveq.l    #11,d1
  15093.     lea    sct_sc88_chorus(pc),a1
  15094.     lea    do_wrt_cmn_b(pc),a2
  15095.     bsr    wrt_comment        *コメント書き出し
  15096.     bsr    do_sc88chrs        *送信パケット生成 > d1.l=packet length
  15097.     bra    set_rdexshp
  15098.  
  15099. do_sc88chrs:                *SC88コーラスパラメータ取得&MIDIメッセージ作成
  15100.     * < d2=DEV ID
  15101.     * > temp_buffer
  15102.     * > d1=packet length(1~)
  15103.     * x d0-d3/a1-a2
  15104.     move.l    temp_buffer(pc),a2
  15105.     move.w    #$f041,(a2)+
  15106.     move.b    d2,(a2)+        *set dev ID
  15107.     move.b    #$42,(a2)+        *set model id
  15108.     move.l    #$12_400138,(a2)+    *cmd,addr
  15109.     moveq.l    #9,d1
  15110.     lea    sc88chrs_limit(pc),a1
  15111.     bsr    get_arry_params        *{}で囲まれた数値の取得(< d1 n of data/> d1=n of data)
  15112.     subq.l    #1,d1
  15113.     bcs    m_parameter_cannot_be_omitted    *パラメータは最低1個
  15114.     moveq.l    #$40+$01+$38,d3
  15115.     bra    set_arry_data
  15116.  
  15117. sc88chrs_limit:    dc.b    0,7,0,127,-1
  15118.     .even
  15119.  
  15120. mml_sc88_delay:                *[SC88_DELAY]
  15121.     moveq.l    #$10,d1            *omitted case value
  15122.     bsr    get_devid_ifn        *>d2=DEV ID
  15123.     bsr    gs_id_set
  15124.     moveq.l    #exclusive_zmd,d0
  15125.     bsr    do_wrt_trk_b
  15126.     moveq.l    #MKID_ROLAND,d0
  15127.     bsr    do_wrt_trk_b
  15128.     moveq.l    #10,d1
  15129.     lea    sct_sc88_delay(pc),a1
  15130.     lea    do_wrt_trk_b(pc),a2
  15131.     bsr    wrt_comment        *コメント書き出し
  15132.     bsr    do_sc88delay        *送信パケット生成 > d1.l=packet length
  15133.     bra    set_rdexml
  15134.  
  15135. sc88_delay:                *.SC88_DELAY
  15136. *    bsr    check_relation_cmn    *コマンド関係チェック
  15137.     moveq.l    #CMN_MIDI_TRANSMISSION,d0
  15138.     bsr    do_wrt_cmn_b
  15139.     moveq.l    #$10,d1            *omitted case value
  15140.     bsr    get_devid_ifn        *d1=I/F number,d2=DEV ID
  15141.     move.l    d1,d0
  15142.     bsr    do_wrt_cmn_b        *I/F number
  15143.     moveq.l    #10,d1
  15144.     lea    sct_sc88_delay(pc),a1
  15145.     lea    do_wrt_cmn_b(pc),a2
  15146.     bsr    wrt_comment        *コメント書き出し
  15147.     bsr    do_sc88delay        *送信パケット生成 > d1.l=packet length
  15148.     bra    set_rdexshp
  15149.  
  15150. do_sc88delay:                *SC88ディレイパラメータ取得&MIDIメッセージ作成
  15151.     * < d2=DEV ID
  15152.     * > temp_buffer
  15153.     * > d1=packet length(1~)
  15154.     * x d0-d3/a1-a2
  15155.     move.l    temp_buffer(pc),a2
  15156.     move.w    #$f041,(a2)+
  15157.     move.b    d2,(a2)+        *set dev ID
  15158.     move.b    #$42,(a2)+        *set model id
  15159.     move.l    #$12_400150,(a2)+    *cmd,addr
  15160.     moveq.l    #11,d1
  15161.     lea    sc88delay_limit(pc),a1
  15162.     bsr    get_arry_params        *{}で囲まれた数値の取得(< d1 n of data/> d1=n of data)
  15163.     subq.l    #1,d1
  15164.     bcs    m_parameter_cannot_be_omitted    *パラメータは最低1個
  15165.     moveq.l    #$40+$01+$50,d3
  15166.     bra    set_arry_data
  15167.  
  15168. sc88delay_limit:    dc.b    0,9,0,7,1,$73,1,$78,1,$78,0,127,-1
  15169.     .even
  15170.  
  15171. mml_sc88_equalizer:            *[SC88_EQUALIZER]
  15172.     moveq.l    #$10,d1            *omitted case value
  15173.     bsr    get_devid_ifn        *>d2=DEV ID
  15174.     bsr    gs_id_set
  15175.     moveq.l    #exclusive_zmd,d0
  15176.     bsr    do_wrt_trk_b
  15177.     moveq.l    #MKID_ROLAND,d0
  15178.     bsr    do_wrt_trk_b
  15179.     moveq.l    #14,d1
  15180.     lea    sct_sc88_equalizer(pc),a1
  15181.     lea    do_wrt_trk_b(pc),a2
  15182.     bsr    wrt_comment        *コメント書き出し
  15183.     bsr    do_sc88eq        *送信パケット生成 > d1.l=packet length
  15184.     bra    set_rdexml
  15185.  
  15186. sc88_equalizer:                *.SC88_EQUALIZER
  15187. *    bsr    check_relation_cmn    *コマンド関係チェック
  15188.     moveq.l    #CMN_MIDI_TRANSMISSION,d0
  15189.     bsr    do_wrt_cmn_b
  15190.     moveq.l    #$10,d1            *omitted case value
  15191.     bsr    get_devid_ifn        *d1=I/F number,d2=DEV ID
  15192.     move.l    d1,d0
  15193.     bsr    do_wrt_cmn_b        *I/F number
  15194.     moveq.l    #14,d1
  15195.     lea    sct_sc88_equalizer(pc),a1
  15196.     lea    do_wrt_cmn_b(pc),a2
  15197.     bsr    wrt_comment        *コメント書き出し
  15198.     bsr    do_sc88eq        *送信パケット生成 > d1.l=packet length
  15199.     bra    set_rdexshp
  15200.  
  15201. do_sc88eq:                *SC88イコライザパラメータ取得&MIDIメッセージ作成
  15202.     * < d2=DEV ID
  15203.     * > temp_buffer
  15204.     * > d1=packet length(1~)
  15205.     * x d0-d3/a1-a2
  15206.     move.l    temp_buffer(pc),a2
  15207.     move.w    #$f041,(a2)+
  15208.     move.b    d2,(a2)+        *set dev ID
  15209.     move.b    #$42,(a2)+        *set model id
  15210.     move.l    #$12_400200,(a2)+    *cmd,addr
  15211.     moveq.l    #4,d1
  15212.     lea    sc88eq_limit(pc),a1
  15213.     bsr    get_arry_params        *{}で囲まれた数値の取得(< d1 n of data/> d1=n of data)
  15214.     subq.l    #1,d1
  15215.     bcs    m_parameter_cannot_be_omitted    *パラメータは最低1個
  15216.     moveq.l    #$40+$02+$00,d3
  15217.     bra    set_arry_data
  15218.  
  15219. sc88eq_limit:    dc.b    0,1,$34,$4c,0,1,$34,$4c,-1
  15220.     .even
  15221.  
  15222. mml_gs_part_setup:            *[GS_PART_SETUP]([SC55_PART_SETUP])
  15223.     move.l    #$1240_1002,d5        *$12:cmd,$401n02:addr
  15224.     bsr    get_prt_devid_ifn    *>d2=DEV ID,d3=part number
  15225.     bsr    gs_id_set
  15226.     cmpi.w    #10,d3            *パート番号をアドレスへ反映
  15227.     bcs    @f
  15228.     bhi    mldec_ptn
  15229.     moveq.l    #0,d3
  15230.     bra    @f
  15231. mldec_ptn:
  15232.     subq.w    #1,d3
  15233. @@:
  15234.     lsl.w    #8,d3
  15235.     or.w    d3,d5
  15236.  
  15237.     moveq.l    #119,d1            *パラメータの個数は最大で119個
  15238.     lea    gs_part_setup_limit(pc),a1
  15239.     bsr    get_arry_params        *{}で囲まれた数値の取得(< d1 n of data/> d1=n of data)
  15240.     move.l    d1,d6
  15241.     beq    m_parameter_cannot_be_omitted    *パラメータは最低1個
  15242.     move.l    arry_stock(pc),a1
  15243.     move.b    (a1),d0            *MIDI CH1-16→0-15
  15244.     subq.b    #1,d0
  15245.     cmpi.b    #$0f,d0
  15246.     bls    @f
  15247.     moveq.l    #$10,d0
  15248. @@:
  15249.     move.b    d0,(a1)            *save ch:0-15
  15250.     lea    gsptofs(pc),a3
  15251. mgpp_lp:
  15252.     moveq.l    #exclusive_zmd,d0
  15253.     bsr    do_wrt_trk_b
  15254.     moveq.l    #MKID_ROLAND,d0
  15255.     bsr    do_wrt_trk_b
  15256.     moveq.l    #13,d1            *文字長
  15257.     move.l    a1,-(sp)
  15258.     lea    sct_gs_ptstup(pc),a1
  15259.     lea    do_wrt_trk_b(pc),a2
  15260.     bsr    wrt_comment        *コメント書き出し
  15261.     move.l    (sp)+,a1
  15262.  
  15263.     bsr    do_gsptstup        *送信パケット生成 > d1.l=packet length
  15264.     subq.w    #7,d1            *header:5,sum:1,tail:1
  15265.     move.l    d1,d0
  15266.     bsr    do_wrt_trk_l        *データ長
  15267.     move.l    temp_buffer(pc),a2
  15268.     addq.w    #5,a2
  15269.     subq.w    #1,d1            *for dbra
  15270. @@:
  15271.     move.b    (a2)+,d0
  15272.     bsr    do_wrt_trk_b
  15273.     dbra    d1,@b
  15274.     tst.l    d6
  15275.     bne    mgpp_lp
  15276.     rts
  15277.  
  15278. gs_part_setup:                *.GS_PART_SETUP(SC55_PART_SETUP)
  15279. *    bsr    check_relation_cmn    *コマンド関係チェック
  15280.     bsr    get_prt_devid_ifn        *d1=I/F number,d2=DEV ID,d3=part number
  15281.     move.l    d1,d7
  15282.  
  15283.     move.l    temp_buffer(pc),a2
  15284.     move.w    #$f041,(a2)+
  15285.     move.b    d2,(a2)+        *set dev ID
  15286.     move.b    #$42,(a2)+        *set model id
  15287.  
  15288.     move.l    #$1240_1002,d5        *$12:cmd,$401n02:addr
  15289.     cmpi.w    #10,d3            *パート番号をアドレスへ反映
  15290.     bcs    @f
  15291.     bhi    dec_ptn
  15292.     moveq.l    #0,d3
  15293.     bra    @f
  15294. dec_ptn:
  15295.     subq.w    #1,d3
  15296. @@:
  15297.     lsl.w    #8,d3
  15298.     or.w    d3,d5
  15299.  
  15300.     moveq.l    #119,d1            *パラメータの個数は最大で119個
  15301.     lea    gs_part_setup_limit(pc),a1
  15302.     bsr    get_arry_params        *{}で囲まれた数値の取得(< d1 n of data/> d1=n of data)
  15303.     move.l    d1,d6
  15304.     beq    m_parameter_cannot_be_omitted    *パラメータは最低1個
  15305.     move.l    arry_stock(pc),a1
  15306.     move.b    (a1),d0            *MIDI CH1-16→0-15
  15307.     subq.b    #1,d0
  15308.     cmpi.b    #$0f,d0
  15309.     bls    @f
  15310.     moveq.l    #$10,d0
  15311. @@:
  15312.     move.b    d0,(a1)            *save ch:0-15
  15313.     lea    gsptofs(pc),a3
  15314. gpp_lp:
  15315.     moveq.l    #CMN_MIDI_TRANSMISSION,d0
  15316.     bsr    do_wrt_cmn_b
  15317.     move.l    d7,d0
  15318.     bsr    do_wrt_cmn_b        *I/F number
  15319.     moveq.l    #13,d1            *文字長
  15320.     move.l    a1,-(sp)
  15321.     lea    sct_gs_ptstup(pc),a1
  15322.     lea    do_wrt_cmn_b(pc),a2
  15323.     bsr    wrt_comment        *コメント書き出し
  15324.     move.l    (sp)+,a1
  15325.  
  15326.     bsr    do_gsptstup        *送信パケット生成 > d1.l=packet length
  15327.     move.l    d1,d0
  15328.     bsr    do_wrt_cmn_l        *データ長
  15329.     move.l    temp_buffer(pc),a2
  15330.     subq.w    #1,d1            *for dbra
  15331. @@:
  15332.     move.b    (a2)+,d0
  15333.     bsr    do_wrt_cmn_b
  15334.     dbra    d1,@b
  15335.     tst.l    d6
  15336.     bne    gpp_lp
  15337.     jmp    cmpl_lp
  15338.  
  15339. gs_part_setup_limit:
  15340.     dc.b    0,17
  15341.     rept    17
  15342.     dc.b    0,1
  15343.     endm
  15344.     dc.b    0,2
  15345.     dc.b    0,2
  15346.     dc.b    $28,$58
  15347.     rept    12
  15348.     dc.b    0,127
  15349.     endm
  15350.     dc.b    $0e,$72
  15351.     dc.b    $0e,$72
  15352.     dc.b    $0e,$50
  15353.     rept    5
  15354.     dc.b    $0e,$72
  15355.     endm
  15356.     rept    12
  15357.     dc.b    0,127
  15358.     endm
  15359.     rept    6
  15360.     dc.b    $28,$58
  15361.     rept    10
  15362.     dc.b    0,127
  15363.     endm
  15364.     endm
  15365.     dc.b    -1
  15366.     .even
  15367.  
  15368. do_gsptstup:                *GSパートセットアップパラメータ取得&MIDIメッセージ作成
  15369.     * < d5.l=param. module address
  15370.     * < d6.l=実際に入力されたパラメータ数
  15371.     * < a1.l=arry_stock+n
  15372.     * < a3.l=スキップ点アドレス・テーブル+n
  15373.     * > temp_buffer
  15374.     * > d1=packet length(1~)
  15375.     * > d5.l=next param. module addr
  15376.     * > d6.l=残りデータ個数
  15377.     * > a1.l=arry_stock+nn
  15378.     * > a3.l=スキップ点アドレス・テーブル+nn
  15379.     * X a2
  15380.     move.l    temp_buffer(pc),a2
  15381.     addq.w    #4,a2
  15382.     move.l    d5,(a2)+        *set cmd,addr
  15383.                     *make initial sum
  15384.     swap    d5
  15385.     move.b    d5,d3
  15386.     swap    d5
  15387.     ror.w    #8,d5
  15388.     add.b    d5,d3
  15389.     ror.w    #8,d5
  15390.     add.b    d5,d3            *d3=address sum
  15391. gsptlp:
  15392.     move.b    (a1)+,d0
  15393.     add.b    d0,d3
  15394.     move.b    d0,(a2)+
  15395.     addq.b    #1,d5            *inc addr
  15396.     move.w    d5,d0
  15397.     andi.w    #$f0ff,d0
  15398.     subq.l    #1,d6
  15399.     beq    calcset_exsm
  15400.     cmp.w    (a3),d0            *スキップ点にきたか
  15401.     bne    gsptlp
  15402.     move.l    (a3)+,d0
  15403.     add.w    d0,d5            *d5.l=next addr
  15404.     bra    calcset_exsm
  15405.  
  15406. gsptofs:
  15407. *    dc.w    $1017,$0000
  15408.     dc.w    $1019,$0000
  15409.     dc.w    $1023,$000d
  15410.     dc.w    $1038,$0008
  15411.     dc.w    $104c,$0fb4
  15412.     dc.w    $200b,$0005
  15413.     dc.w    $201b,$0005
  15414.     dc.w    $202b,$0005
  15415.     dc.w    $203b,$0005
  15416.     dc.w    $204b,$0005
  15417.     dc.w    -1
  15418.  
  15419. mml_sc88_part_setup:            *[SC88_PART_SETUP]
  15420.     move.l    #$1240_1002,d5        *$12:cmd,$401n02:addr
  15421.     bsr    get_prt_devid_ifn    *>d2=DEV ID,d3=part number
  15422.     bsr    gs_id_set
  15423.     cmpi.w    #10,d3            *パート番号をアドレスへ反映
  15424.     bcs    @f
  15425.     bhi    1f
  15426.     moveq.l    #0,d3
  15427.     bra    @f
  15428. 1:
  15429.     subq.w    #1,d3
  15430. @@:
  15431.     lsl.w    #8,d3
  15432.     or.w    d3,d5
  15433.  
  15434.     moveq.l    #127,d1            *パラメータの個数は最大で127個
  15435.     lea    sc88_part_setup_limit(pc),a1
  15436.     bsr    get_arry_params        *{}で囲まれた数値の取得(< d1 n of data/> d1=n of data)
  15437.     move.l    d1,d6
  15438.     beq    m_parameter_cannot_be_omitted    *パラメータは最低1個
  15439.     move.l    arry_stock(pc),a1
  15440.     move.b    (a1),d0            *MIDI CH1-16→0-15
  15441.     subq.b    #1,d0
  15442.     cmpi.b    #$0f,d0
  15443.     bls    @f
  15444.     moveq.l    #$10,d0
  15445. @@:
  15446.     move.b    d0,(a1)            *save ch:0-15
  15447.     lea    sc88ptofs(pc),a3
  15448. msps_lp:
  15449.     moveq.l    #exclusive_zmd,d0
  15450.     bsr    do_wrt_trk_b
  15451.     moveq.l    #MKID_ROLAND,d0
  15452.     bsr    do_wrt_trk_b
  15453.     moveq.l    #15,d1            *文字長
  15454.     move.l    a1,-(sp)
  15455.     lea    sct_sc88_ptstup(pc),a1
  15456.     lea    do_wrt_trk_b(pc),a2
  15457.     bsr    wrt_comment        *コメント書き出し
  15458.     move.l    (sp)+,a1
  15459.  
  15460.     bsr    do_gsptstup        *送信パケット生成 > d1.l=packet length
  15461.     subq.w    #7,d1            *header:5,sum:1,tail:1
  15462.     move.l    d1,d0
  15463.     bsr    do_wrt_trk_l        *データ長
  15464.     move.l    temp_buffer(pc),a2
  15465.     addq.w    #5,a2
  15466.     subq.w    #1,d1            *for dbra,sum分除外
  15467. @@:
  15468.     move.b    (a2)+,d0
  15469.     bsr    do_wrt_trk_b
  15470.     dbra    d1,@b
  15471.     tst.l    d6
  15472.     bne    msps_lp
  15473.     rts
  15474.  
  15475. sc88_part_setup:            *.SC88_PART_SETUP
  15476. *    bsr    check_relation_cmn    *コマンド関係チェック
  15477.     bsr    get_prt_devid_ifn        *d1=I/F number,d2=DEV ID,d3=part number
  15478.     move.l    d1,d7
  15479.  
  15480.     move.l    temp_buffer(pc),a2
  15481.     move.w    #$f041,(a2)+
  15482.     move.b    d2,(a2)+        *set dev ID
  15483.     move.b    #$42,(a2)+        *set model id
  15484.  
  15485.     move.l    #$1240_1002,d5        *$12:cmd,$401n02:addr
  15486.     cmpi.w    #10,d3            *パート番号をアドレスへ反映
  15487.     bcs    @f
  15488.     bhi    1f
  15489.     moveq.l    #0,d3
  15490.     bra    @f
  15491. 1:
  15492.     subq.w    #1,d3
  15493. @@:
  15494.     lsl.w    #8,d3
  15495.     or.w    d3,d5
  15496.  
  15497.     moveq.l    #127,d1            *パラメータの個数は最大で127個
  15498.     lea    sc88_part_setup_limit(pc),a1
  15499.     bsr    get_arry_params        *{}で囲まれた数値の取得(< d1 n of data/> d1=n of data)
  15500.     move.l    d1,d6
  15501.     beq    m_parameter_cannot_be_omitted    *パラメータは最低1個
  15502.     move.l    arry_stock(pc),a1
  15503.     move.b    (a1),d0            *MIDI CH1-16→0-15
  15504.     subq.b    #1,d0
  15505.     cmpi.b    #$0f,d0
  15506.     bls    @f
  15507.     moveq.l    #$10,d0
  15508. @@:
  15509.     move.b    d0,(a1)            *save ch:0-15
  15510.     lea    sc88ptofs(pc),a3
  15511. mps_lp:
  15512.     moveq.l    #CMN_MIDI_TRANSMISSION,d0
  15513.     bsr    do_wrt_cmn_b
  15514.     move.l    d7,d0
  15515.     bsr    do_wrt_cmn_b        *I/F number
  15516.     moveq.l    #15,d1            *文字長
  15517.     move.l    a1,-(sp)
  15518.     lea    sct_sc88_ptstup(pc),a1
  15519.     lea    do_wrt_cmn_b(pc),a2
  15520.     bsr    wrt_comment        *コメント書き出し
  15521.     move.l    (sp)+,a1
  15522.  
  15523.     bsr    do_gsptstup        *送信パケット生成 > d1.l=packet length
  15524.     move.l    d1,d0
  15525.     bsr    do_wrt_cmn_l        *データ長
  15526.     move.l    temp_buffer(pc),a2
  15527.     subq.w    #1,d1            *for dbra
  15528. @@:
  15529.     move.b    (a2)+,d0
  15530.     bsr    do_wrt_cmn_b
  15531.     dbra    d1,@b
  15532.     tst.l    d6
  15533.     bne    mps_lp
  15534.     jmp    cmpl_lp
  15535.  
  15536. sc88_part_setup_limit:
  15537.     dc.b    0,16
  15538.     rept    17
  15539.     dc.b    0,1
  15540.     endm
  15541.     dc.b    0,2
  15542.     dc.b    0,2
  15543.     dc.b    $28,$58
  15544.     rept    8
  15545.     dc.b    0,127
  15546.     endm
  15547.     dc.b    0,$5f
  15548.     dc.b    0,$5f
  15549.     dc.b    0,$7f
  15550.     dc.b    0,$7f
  15551.     dc.b    0,1
  15552.     dc.b    0,1
  15553.     rept    23
  15554.     dc.b    0,$7f
  15555.     endm
  15556.     dc.b    $28,$58
  15557.     rept    10
  15558.     dc.b    0,127
  15559.     endm
  15560.     dc.b    $40,$58
  15561.     rept    10
  15562.     dc.b    0,127
  15563.     endm
  15564.     rept    4
  15565.     dc.b    $28,$58
  15566.     rept    10
  15567.     dc.b    0,127
  15568.     endm
  15569.     endm
  15570.     dc.b    0,2
  15571.     dc.b    1,2
  15572.     dc.b    0,1
  15573.     dc.b    -1
  15574.     .even
  15575.  
  15576. sc88ptofs:
  15577.     dc.w    $1019,$0000
  15578.     dc.w    $1025,$0005
  15579.     dc.w    $102d,$0003
  15580.     dc.w    $1038,$0008
  15581.     dc.w    $104c,$0fb4
  15582.     dc.w    $2001,$0000
  15583.     dc.w    $2002,$0000
  15584.     dc.w    $2003,$0000
  15585.     dc.w    $2004,$0000
  15586.     dc.w    $2005,$0000
  15587.     dc.w    $2006,$0000
  15588.     dc.w    $2007,$0000
  15589.     dc.w    $2008,$0000
  15590.     dc.w    $2009,$0000
  15591.     dc.w    $200a,$0000
  15592.     dc.w    $200b,$0005
  15593.     dc.w    $2011,$0000
  15594.     dc.w    $2012,$0000
  15595.     dc.w    $2013,$0000
  15596.     dc.w    $2014,$0000
  15597.     dc.w    $2015,$0000
  15598.     dc.w    $2016,$0000
  15599.     dc.w    $2017,$0000
  15600.     dc.w    $2018,$0000
  15601.     dc.w    $2019,$0000
  15602.     dc.w    $201a,$0000
  15603.     dc.w    $201b,$0005
  15604.     dc.w    $2021,$0000
  15605.     dc.w    $2022,$0000
  15606.     dc.w    $2023,$0000
  15607.     dc.w    $2024,$0000
  15608.     dc.w    $2025,$0000
  15609.     dc.w    $2026,$0000
  15610.     dc.w    $2027,$0000
  15611.     dc.w    $2028,$0000
  15612.     dc.w    $2029,$0000
  15613.     dc.w    $202a,$0000
  15614.     dc.w    $202b,$0005
  15615.     dc.w    $2031,$0000
  15616.     dc.w    $2032,$0000
  15617.     dc.w    $2033,$0000
  15618.     dc.w    $2034,$0000
  15619.     dc.w    $2035,$0000
  15620.     dc.w    $2036,$0000
  15621.     dc.w    $2037,$0000
  15622.     dc.w    $2038,$0000
  15623.     dc.w    $2039,$0000
  15624.     dc.w    $203a,$0000
  15625.     dc.w    $203b,$0005
  15626.     dc.w    $2041,$0000
  15627.     dc.w    $2042,$0000
  15628.     dc.w    $2043,$0000
  15629.     dc.w    $2044,$0000
  15630.     dc.w    $2045,$0000
  15631.     dc.w    $2046,$0000
  15632.     dc.w    $2047,$0000
  15633.     dc.w    $2048,$0000
  15634.     dc.w    $2049,$0000
  15635.     dc.w    $204a,$0000
  15636.     dc.w    $204b,$0005
  15637.     dc.w    $2051,$0000
  15638.     dc.w    $2052,$0000
  15639.     dc.w    $2053,$0000
  15640.     dc.w    $2054,$0000
  15641.     dc.w    $2055,$0000
  15642.     dc.w    $2056,$0000
  15643.     dc.w    $2057,$0000
  15644.     dc.w    $2058,$0000
  15645.     dc.w    $2059,$0000
  15646.     dc.w    $205a,$0000
  15647.     dc.w    $205b,$1FA5
  15648.     dc.w    $4001,$0000
  15649.     dc.w    $4002,$001e
  15650.     dc.w    -1
  15651.  
  15652. mml_gs_drum_setup:            *[GS_DRUM_SETUP]([SC55_DRUM_SETUP])
  15653.     move.l    #$1241_0100,d5        *$12:cmd,$41m1kk:addr
  15654.     bsr    get_mp_ky_devid_ifn    *>d2=DEV ID,d3.hw=map number,d3.lw=key number
  15655.     bsr    gs_id_set
  15656.     move.b    d3,d5            *map番号,key番号をアドレスへ反映
  15657.     swap    d3
  15658.     ror.w    #8,d3
  15659.     andi.w    #$f000,d3
  15660.     or.w    d3,d5
  15661.  
  15662.     moveq.l    #8,d1            *パラメータの個数は最大で8個
  15663.     lea    gs_drum_setup_limit(pc),a1
  15664.     bsr    get_arry_params        *{}で囲まれた数値の取得(< d1 n of data/> d1=n of data)
  15665.     move.l    d1,d6
  15666.     beq    m_parameter_cannot_be_omitted    *パラメータは最低1個
  15667.     move.l    arry_stock(pc),a1
  15668. mgds_lp:
  15669.     moveq.l    #exclusive_zmd,d0
  15670.     bsr    do_wrt_trk_b
  15671.     moveq.l    #MKID_ROLAND,d0
  15672.     bsr    do_wrt_trk_b
  15673.     moveq.l    #13,d1            *文字長
  15674.     move.l    a1,-(sp)
  15675.     lea    sct_gs_drmstup(pc),a1
  15676.     lea    do_wrt_trk_b(pc),a2
  15677.     bsr    wrt_comment        *コメント書き出し
  15678.     move.l    (sp)+,a1
  15679.  
  15680.     bsr    do_gsdrmstup        *送信パケット生成
  15681.     moveq.l    #5-1,d0            *チェックサムの分は含めない
  15682.     bsr    do_wrt_trk_l        *データ長
  15683.     lea    exc_addr(pc),a2
  15684.     moveq.l    #5-1-1,d1
  15685. @@:
  15686.     move.b    (a2)+,d0
  15687.     bsr    do_wrt_trk_b
  15688.     dbra    d1,@b
  15689.     tst.l    d6
  15690.     bne    mgds_lp
  15691.     rts
  15692.  
  15693. gs_drum_setup:                *.GS_DRUM_SETUP(SC55_DRUM_SETUP)
  15694. *    bsr    check_relation_cmn    *コマンド関係チェック
  15695.     bsr    get_mp_ky_devid_ifn    *d1=I/F number,d2=DEV ID,d3.hw=map number,d3.lw=key number
  15696.     move.l    d1,d7
  15697.  
  15698.     lea    header+2(pc),a2
  15699.     move.b    d2,(a2)+        *set dev ID
  15700.     move.b    #$42,(a2)+        *set model id
  15701.  
  15702.     move.l    #$1241_0100,d5        *$12:cmd,$41m1kk:addr
  15703.     move.b    d3,d5            *map番号,key番号をアドレスへ反映
  15704.     swap    d3
  15705.     ror.w    #8,d3
  15706.     andi.w    #$f000,d3
  15707.     or.w    d3,d5
  15708.  
  15709.     moveq.l    #8,d1            *パラメータの個数は最大で8個
  15710.     lea    gs_drum_setup_limit(pc),a1
  15711.     bsr    get_arry_params        *{}で囲まれた数値の取得(< d1 n of data/> d1=n of data)
  15712.     move.l    d1,d6
  15713.     beq    m_parameter_cannot_be_omitted    *パラメータは最低1個
  15714.     move.l    arry_stock(pc),a1
  15715. gds_lp:
  15716.     moveq.l    #CMN_MIDI_TRANSMISSION,d0
  15717.     bsr    do_wrt_cmn_b
  15718.     move.l    d7,d0
  15719.     bsr    do_wrt_cmn_b        *I/F number
  15720.     moveq.l    #13,d1            *文字長
  15721.     move.l    a1,-(sp)
  15722.     lea    sct_gs_drmstup(pc),a1
  15723.     lea    do_wrt_cmn_b(pc),a2
  15724.     bsr    wrt_comment        *コメント書き出し
  15725.     move.l    (sp)+,a1
  15726.  
  15727.     bsr    do_gsdrmstup        *送信パケット生成 > d1.l=packet length
  15728.     move.l    #11,d0
  15729.     bsr    do_wrt_cmn_l        *データ長
  15730.     lea    exc_addr(pc),a2
  15731.     moveq.l    #11-1,d1
  15732. @@:
  15733.     move.b    (a2)+,d0
  15734.     bsr    do_wrt_cmn_b
  15735.     dbra    d1,@b
  15736.     tst.l    d6
  15737.     bne    gds_lp
  15738.     jmp    cmpl_lp
  15739.  
  15740. gs_drum_setup_limit:
  15741.     rept    6
  15742.     dc.b    0,127
  15743.     endm
  15744.     dc.b    0,1
  15745.     dc.b    0,1
  15746.     dc.b    -1
  15747.     .even
  15748.  
  15749. do_gsdrmstup:                *GSドラムセットアップパラメータ取得&MIDIメッセージ作成
  15750.     * < d5.l=param. module address
  15751.     * < d6.l=実際に入力されたパラメータ数
  15752.     * < a1.l=arry_stock+n
  15753.     * > temp_buffer
  15754.     * > d1=packet length(1~)
  15755.     * > d5.l=next param. module addr
  15756.     * > d6.l=残りデータ個数
  15757.     * > a1.l=arry_stock+nn
  15758.     * X a2
  15759.     lea    header+4(pc),a2
  15760.     move.l    d5,(a2)+        *set cmd,addr
  15761.                     *make initial sum
  15762.     swap    d5
  15763.     move.b    d5,d3
  15764.     swap    d5
  15765.     ror.w    #8,d5
  15766.     add.b    d5,d3
  15767.     ror.w    #8,d5
  15768.     add.b    d5,d3            *d3=address sum
  15769.     move.b    (a1)+,d0
  15770.     add.b    d0,d3
  15771.     move.b    d0,(a2)+
  15772.     add.w    #$0100,d5        *inc addr
  15773.     moveq.l    #$80,d0
  15774.     andi.b    #$7f,d3
  15775.     sub.b    d3,d0
  15776.     andi.b    #$7f,d0
  15777.     move.b    d0,(a2)+        *sum
  15778.     rts
  15779.  
  15780. mml_gs_drum_name:            *[GS_DRUM_NAME]([SC55_DRUM_NAME])
  15781.     bsr    get_map_devid_ifn    *>d2=DEV ID,d3=map number
  15782.     bsr    gs_id_set
  15783.     moveq.l    #exclusive_zmd,d0
  15784.     bsr    do_wrt_trk_b
  15785.     moveq.l    #MKID_ROLAND,d0
  15786.     bsr    do_wrt_trk_b
  15787.     moveq.l    #15,d1
  15788.     lea    sct_gs_drmname(pc),a1
  15789.     lea    do_wrt_trk_b(pc),a2
  15790.     bsr    wrt_comment        *コメント書き出し
  15791.     bsr    do_gsdrmnm        *送信パケット生成 > d1.l=packet length
  15792.     bra    set_rdexml
  15793.  
  15794. gs_drum_name:                *.GS_DRUM_NAME(.SC55_DRUM_NAME)
  15795. *    bsr    check_relation_cmn    *コマンド関係チェック
  15796.     moveq.l    #CMN_MIDI_TRANSMISSION,d0
  15797.     bsr    do_wrt_cmn_b
  15798.     bsr    get_map_devid_ifn    *d1=I/F number,d2=DEV ID,d3=map number
  15799.     move.l    d1,d0
  15800.     bsr    do_wrt_cmn_b        *I/F number
  15801.     moveq.l    #15,d1
  15802.     lea    sct_gs_drmname(pc),a1
  15803.     lea    do_wrt_cmn_b(pc),a2
  15804.     bsr    wrt_comment        *コメント書き出し
  15805.     bsr    do_gsdrmnm        *送信パケット生成 > d1.l=packet length
  15806.     bra    set_rdexshp
  15807.  
  15808. do_gsdrmnm:                *SC55ドラムセットの名前の設定
  15809.     * < d2=DEV ID
  15810.     * < d3=MAP NUMBER(0,1/$80+0,1)    $80+はUERケース
  15811.     * > temp_buffer
  15812.     * > d1=packet length(1~)
  15813.     * x d0-d3/a1-a2
  15814.     move.l    temp_buffer(pc),a2
  15815.     move.w    #$f041,(a2)+
  15816.     move.b    d2,(a2)+        *set dev ID
  15817.     move.b    #$42,(a2)+        *set model id
  15818.     move.l    #$12_410000,d1
  15819.     bclr.l    #7,d3
  15820.     bne    m_illegal_map_number    *user case
  15821.     tst.b    d3            *preset case
  15822.     beq    @f
  15823.     move.w    #$1000,d1
  15824.     moveq.l    #$51,d3            *address sum
  15825.     bra    1f
  15826. @@:
  15827.     moveq.l    #$41,d3            *address sum
  15828. 1:
  15829.     move.l    d1,(a2)+        *cmd,addr
  15830.     moveq.l    #12,d1            *最大文字列長
  15831.     bsr    get_string_param    *""で囲まれた文字列の取得(< d1 n of data/> d1=n of data)
  15832.     moveq.l    #12-1,d1
  15833.     bra    set_arry_data
  15834.  
  15835. mml_sc88_drum_setup:            *[SC88_DRUM_SETUP]
  15836.     move.l    #$1241_0100,d5        *$12:cmd,$41m1kk:addr
  15837.     bsr    get_mp_ky_devid_ifn    *>d2=DEV ID,d3.hw=map number,d3.lw=key number
  15838.     bsr    gs_id_set
  15839.     move.b    d3,d5            *map番号,key番号をアドレスへ反映
  15840.     swap    d3
  15841.     ror.w    #8,d3
  15842.     andi.w    #$f000,d3
  15843.     or.w    d3,d5
  15844.  
  15845.     moveq.l    #9,d1            *パラメータの個数は最大で9個
  15846.     lea    sc88_drum_setup_limit(pc),a1
  15847.     bsr    get_arry_params        *{}で囲まれた数値の取得(< d1 n of data/> d1=n of data)
  15848.     move.l    d1,d6
  15849.     beq    m_parameter_cannot_be_omitted    *パラメータは最低1個
  15850.     move.l    arry_stock(pc),a1
  15851. msds_lp:
  15852.     moveq.l    #exclusive_zmd,d0
  15853.     bsr    do_wrt_trk_b
  15854.     moveq.l    #MKID_ROLAND,d0
  15855.     bsr    do_wrt_trk_b
  15856.     moveq.l    #15,d1            *文字長
  15857.     move.l    a1,-(sp)
  15858.     lea    sct_sc88_drmstup(pc),a1
  15859.     lea    do_wrt_trk_b(pc),a2
  15860.     bsr    wrt_comment        *コメント書き出し
  15861.     move.l    (sp)+,a1
  15862.  
  15863.     bsr    do_gsdrmstup        *送信パケット生成
  15864.     moveq.l    #5-1,d0            *sum分除外
  15865.     bsr    do_wrt_trk_l        *データ長
  15866.     lea    exc_addr(pc),a2
  15867.     moveq.l    #5-1-1,d1
  15868. @@:
  15869.     move.b    (a2)+,d0
  15870.     bsr    do_wrt_trk_b
  15871.     dbra    d1,@b
  15872.     tst.l    d6
  15873.     bne    msds_lp
  15874.     rts
  15875.  
  15876. sc88_drum_setup:            *.SC88_DRUM_SETUP
  15877. *    bsr    check_relation_cmn    *コマンド関係チェック
  15878.     bsr    get_mp_ky_devid_ifn    *d1=I/F number,d2=DEV ID,d3.hw=map number,d3.lw=key number
  15879.     move.l    d1,d7
  15880.  
  15881.     lea    header+2(pc),a2
  15882.     move.b    d2,(a2)+        *set dev ID
  15883.     move.b    #$42,(a2)+        *set model id
  15884.  
  15885.     move.l    #$1241_0100,d5        *$12:cmd,$41m1kk:addr
  15886.     move.b    d3,d5            *map番号,key番号をアドレスへ反映
  15887.     swap    d3
  15888.     ror.w    #8,d3
  15889.     andi.w    #$f000,d3
  15890.     or.w    d3,d5
  15891.  
  15892.     moveq.l    #9,d1            *パラメータの個数は最大で9個
  15893.     lea    sc88_drum_setup_limit(pc),a1
  15894.     bsr    get_arry_params        *{}で囲まれた数値の取得(< d1 n of data/> d1=n of data)
  15895.     move.l    d1,d6
  15896.     beq    m_parameter_cannot_be_omitted    *パラメータは最低1個
  15897.     move.l    arry_stock(pc),a1
  15898. sds_lp:
  15899.     moveq.l    #CMN_MIDI_TRANSMISSION,d0
  15900.     bsr    do_wrt_cmn_b
  15901.     move.l    d7,d0
  15902.     bsr    do_wrt_cmn_b        *I/F number
  15903.     moveq.l    #15,d1            *文字長
  15904.     move.l    a1,-(sp)
  15905.     lea    sct_sc88_drmstup(pc),a1
  15906.     lea    do_wrt_cmn_b(pc),a2
  15907.     bsr    wrt_comment        *コメント書き出し
  15908.     move.l    (sp)+,a1
  15909.  
  15910.     bsr    do_gsdrmstup        *送信パケット生成 > d1.l=packet length
  15911.     move.l    #11,d0
  15912.     bsr    do_wrt_cmn_l        *データ長
  15913.     lea    exc_addr(pc),a2
  15914.     moveq.l    #11-1,d1
  15915. @@:
  15916.     move.b    (a2)+,d0
  15917.     bsr    do_wrt_cmn_b
  15918.     dbra    d1,@b
  15919.     tst.l    d6
  15920.     bne    sds_lp
  15921.     jmp    cmpl_lp
  15922.  
  15923. sc88_drum_setup_limit:
  15924.     rept    6
  15925.     dc.b    0,127
  15926.     endm
  15927.     dc.b    0,1
  15928.     dc.b    0,1
  15929.     dc.b    0,127
  15930.     dc.b    -1
  15931.     .even
  15932.  
  15933. mml_gs_print:                *[GS_PRINT]([SC55_PRINT])
  15934.     moveq.l    #$10,d1            *omitted case value
  15935.     bsr    get_devid_ifn        *>d2=DEV ID
  15936.     bsr    sc55_id_set
  15937.     moveq.l    #exclusive_zmd,d0
  15938.     bsr    do_wrt_trk_b
  15939.     moveq.l    #MKID_ROLAND,d0
  15940.     bsr    do_wrt_trk_b
  15941.     moveq.l    #8,d1
  15942.     lea    sct_gs_print(pc),a1
  15943.     lea    do_wrt_trk_b(pc),a2
  15944.     bsr    wrt_comment        *コメント書き出し
  15945.     bsr    do_gsprt        *送信パケット生成 > d1.l=packet length
  15946.     bra    set_rdexml
  15947.  
  15948. gs_print:                *.GS_PRINT(SC55_PRINT)
  15949. *    bsr    check_relation_cmn    *コマンド関係チェック
  15950.     moveq.l    #CMN_MIDI_TRANSMISSION,d0
  15951.     bsr    do_wrt_cmn_b
  15952.     moveq.l    #$10,d1            *omitted case value
  15953.     bsr    get_devid_ifn        *d1=I/F number,d2=DEV ID
  15954.     move.l    d1,d0
  15955.     bsr    do_wrt_cmn_b        *I/F number
  15956.     moveq.l    #8,d1
  15957.     lea    sct_gs_print(pc),a1
  15958.     lea    do_wrt_cmn_b(pc),a2
  15959.     bsr    wrt_comment        *コメント書き出し
  15960.     bsr    do_gsprt        *送信パケット生成 > d1.l=packet length
  15961.     bra    set_rdexshp
  15962.  
  15963. do_gsprt:                *GS文字列出力パラメータ取得&MIDIメッセージ作成
  15964.     * < d2=DEV ID
  15965.     * > temp_buffer
  15966.     * > d1=packet length(1~)
  15967.     * x d0-d3/a1-a2
  15968.     move.l    temp_buffer(pc),a2
  15969.     move.w    #$f041,(a2)+
  15970.     move.b    d2,(a2)+        *set dev ID
  15971.     move.b    #$45,(a2)+        *set model id
  15972.     move.l    #$12_100000,(a2)+    *cmd,addr
  15973.     moveq.l    #32,d1            *最大文字列長
  15974.     bsr    get_string_param    *""で囲まれた文字列の取得(< d1 n of data/> d1=n of data)
  15975.     subq.l    #1,d1
  15976.     bcs    m_parameter_cannot_be_omitted    *パラメータは最低1個
  15977.     moveq.l    #$10,d3            *address sum
  15978.     bra    set_arry_data
  15979.  
  15980. mml_sc88_user_inst:            *[SC88_USER_INST]
  15981.     move.l    #$1220_0000,d5        *$12:cmd,$20b0pp:addr
  15982.     bsr    get_bk_pg_devid_ifn    *>d2=DEV ID,d3.hw=bank number,d3.lw=program number
  15983.     bsr    gs_id_set
  15984.     move.b    d3,d5            *map番号,key番号をアドレスへ反映
  15985.     swap    d3
  15986.     ror.w    #8,d3
  15987.     andi.w    #$f000,d3
  15988.     or.w    d3,d5
  15989.  
  15990.     moveq.l    #11,d1            *パラメータの個数は最大で11個
  15991.     lea    sc88_user_inst_limit(pc),a1
  15992.     bsr    get_arry_params        *{}で囲まれた数値の取得(< d1 n of data/> d1=n of data)
  15993.     move.l    d1,d6
  15994.     beq    m_parameter_cannot_be_omitted    *パラメータは最低1個
  15995.     move.l    arry_stock(pc),a1
  15996.     subq.b    #1,2(a1)        *1-128→0-127
  15997. msui_lp:
  15998.     moveq.l    #exclusive_zmd,d0
  15999.     bsr    do_wrt_trk_b
  16000.     moveq.l    #MKID_ROLAND,d0
  16001.     bsr    do_wrt_trk_b
  16002.     moveq.l    #14,d1            *文字長
  16003.     move.l    a1,-(sp)
  16004.     lea    sct_sc88_usrinst(pc),a1
  16005.     lea    do_wrt_trk_b(pc),a2
  16006.     bsr    wrt_comment        *コメント書き出し
  16007.     move.l    (sp)+,a1
  16008.  
  16009.     bsr    do_gsdrmstup        *送信パケット生成
  16010.     moveq.l    #5-1,d0            *チェックサム分除外
  16011.     bsr    do_wrt_trk_l        *データ長
  16012.     lea    exc_addr(pc),a2
  16013.     moveq.l    #5-1-1,d1
  16014. @@:
  16015.     move.b    (a2)+,d0
  16016.     bsr    do_wrt_trk_b
  16017.     dbra    d1,@b
  16018.     tst.l    d6
  16019.     bne    msui_lp
  16020.     rts
  16021.  
  16022. sc88_user_inst:                *.SC88_USER_INST
  16023. *    bsr    check_relation_cmn    *コマンド関係チェック
  16024.     bsr    get_bk_pg_devid_ifn    *d1=I/F number,d2=DEV ID,d3.hw=bank number,d3.lw=program number
  16025.     move.l    d1,d7
  16026.  
  16027.     lea    header+2(pc),a2
  16028.     move.b    d2,(a2)+        *set dev ID
  16029.     move.b    #$42,(a2)+        *set model id
  16030.  
  16031.     move.l    #$1220_0000,d5        *$12:cmd,$20b0pp:addr
  16032.     move.b    d3,d5            *map番号,key番号をアドレスへ反映
  16033.     swap    d3
  16034.     ror.w    #8,d3
  16035.     andi.w    #$f000,d3
  16036.     or.w    d3,d5
  16037.  
  16038.     moveq.l    #11,d1            *パラメータの個数は最大で11個
  16039.     lea    sc88_user_inst_limit(pc),a1
  16040.     bsr    get_arry_params        *{}で囲まれた数値の取得(< d1 n of data/> d1=n of data)
  16041.     move.l    d1,d6
  16042.     beq    m_parameter_cannot_be_omitted    *パラメータは最低1個
  16043.     move.l    arry_stock(pc),a1
  16044.     subq.b    #1,2(a1)        *1-128→0-127
  16045. sui_lp:
  16046.     moveq.l    #CMN_MIDI_TRANSMISSION,d0
  16047.     bsr    do_wrt_cmn_b
  16048.     move.l    d7,d0
  16049.     bsr    do_wrt_cmn_b        *I/F number
  16050.     moveq.l    #14,d1            *文字長
  16051.     move.l    a1,-(sp)
  16052.     lea    sct_sc88_usrinst(pc),a1
  16053.     lea    do_wrt_cmn_b(pc),a2
  16054.     bsr    wrt_comment        *コメント書き出し
  16055.     move.l    (sp)+,a1
  16056.  
  16057.     bsr    do_gsdrmstup        *送信パケット生成 > d1.l=packet length
  16058.     move.l    #11,d0
  16059.     bsr    do_wrt_cmn_l        *データ長
  16060.     lea    exc_addr(pc),a2
  16061.     moveq.l    #11-1,d1
  16062. @@:
  16063.     move.b    (a2)+,d0
  16064.     bsr    do_wrt_cmn_b
  16065.     dbra    d1,@b
  16066.     tst.l    d6
  16067.     bne    sui_lp
  16068.     jmp    cmpl_lp
  16069.  
  16070. sc88_user_inst_limit:
  16071.     dc.b    1,2
  16072.     dc.b    0,127
  16073.     dc.b    1,128
  16074.     rept    8
  16075.     dc.b    0,127
  16076.     endm
  16077.     dc.b    -1
  16078.     .even
  16079.  
  16080. mml_sc88_user_drum:            *[SC88_USER_DRUM]
  16081.     move.l    #$1221_0100,d5        *$12:cmd,$21d1rr:addr
  16082.     bsr    get_mp_ky_devid_ifn    *>d2=DEV ID,d3.hw=map number,d3.lw=key number
  16083.     bsr    gs_id_set
  16084.     move.b    d3,d5            *map番号,key番号をアドレスへ反映
  16085.     swap    d3
  16086.     ror.w    #8,d3
  16087.     andi.w    #$f000,d3
  16088.     or.w    d3,d5
  16089.  
  16090.     moveq.l    #12,d1            *パラメータの個数は最大で12個
  16091.     lea    sc88_user_drum_limit(pc),a1
  16092.     bsr    get_arry_params        *{}で囲まれた数値の取得(< d1 n of data/> d1=n of data)
  16093.     move.l    d1,d6
  16094.     beq    m_parameter_cannot_be_omitted    *パラメータは最低1個
  16095.     move.l    arry_stock(pc),a1
  16096. msud_lp:
  16097.     moveq.l    #exclusive_zmd,d0
  16098.     bsr    do_wrt_trk_b
  16099.     moveq.l    #MKID_ROLAND,d0
  16100.     bsr    do_wrt_trk_b
  16101.     moveq.l    #14,d1            *文字長
  16102.     move.l    a1,-(sp)
  16103.     lea    sct_sc88_usrdrum(pc),a1
  16104.     lea    do_wrt_trk_b(pc),a2
  16105.     bsr    wrt_comment        *コメント書き出し
  16106.     move.l    (sp)+,a1
  16107.  
  16108.     bsr    do_gsdrmstup        *送信パケット生成
  16109.     moveq.l    #5-1,d0            *チェックサム分除外
  16110.     bsr    do_wrt_trk_l        *データ長
  16111.     lea    exc_addr(pc),a2
  16112.     moveq.l    #5-1-1,d1
  16113. @@:
  16114.     move.b    (a2)+,d0
  16115.     bsr    do_wrt_trk_b
  16116.     dbra    d1,@b
  16117.     tst.l    d6
  16118.     bne    msud_lp
  16119.     rts
  16120.  
  16121. sc88_user_drum:                *.SC88_USER_DRUM
  16122. *    bsr    check_relation_cmn    *コマンド関係チェック
  16123.     bsr    get_mp_ky_devid_ifn    *d1=I/F number,d2=DEV ID,d3.hw=map number,d3.lw=ky number
  16124.     move.l    d1,d7
  16125.  
  16126.     lea    header+2(pc),a2
  16127.     move.b    d2,(a2)+        *set dev ID
  16128.     move.b    #$42,(a2)+        *set model id
  16129.  
  16130.     move.l    #$1221_0100,d5        *$12:cmd,$21d1rr:addr
  16131.     move.b    d3,d5            *map番号,key番号をアドレスへ反映
  16132.     swap    d3
  16133.     ror.w    #8,d3
  16134.     andi.w    #$f000,d3
  16135.     or.w    d3,d5
  16136.  
  16137.     moveq.l    #12,d1            *パラメータの個数は最大で12個
  16138.     lea    sc88_user_drum_limit(pc),a1
  16139.     bsr    get_arry_params        *{}で囲まれた数値の取得(< d1 n of data/> d1=n of data)
  16140.     move.l    d1,d6
  16141.     beq    m_parameter_cannot_be_omitted    *パラメータは最低1個
  16142.     move.l    arry_stock(pc),a1
  16143. sud_lp:
  16144.     moveq.l    #CMN_MIDI_TRANSMISSION,d0
  16145.     bsr    do_wrt_cmn_b
  16146.     move.l    d7,d0
  16147.     bsr    do_wrt_cmn_b        *I/F number
  16148.     moveq.l    #14,d1            *文字長
  16149.     move.l    a1,-(sp)
  16150.     lea    sct_sc88_usrdrum(pc),a1
  16151.     lea    do_wrt_cmn_b(pc),a2
  16152.     bsr    wrt_comment        *コメント書き出し
  16153.     move.l    (sp)+,a1
  16154.  
  16155.     bsr    do_gsdrmstup        *送信パケット生成 > d1.l=packet length
  16156.     move.l    #11,d0
  16157.     bsr    do_wrt_cmn_l        *データ長
  16158.     lea    exc_addr(pc),a2
  16159.     moveq.l    #11-1,d1
  16160. @@:
  16161.     move.b    (a2)+,d0
  16162.     bsr    do_wrt_cmn_b
  16163.     dbra    d1,@b
  16164.     tst.l    d6
  16165.     bne    sud_lp
  16166.     jmp    cmpl_lp
  16167.  
  16168. sc88_user_drum_limit:
  16169.     rept    6
  16170.     dc.b    0,127
  16171.     endm
  16172.     dc.b    0,1
  16173.     dc.b    0,1
  16174.     dc.b    0,127
  16175.     dc.b    0,2
  16176.     dc.b    0,127
  16177.     dc.b    0,127
  16178.     dc.b    -1
  16179.     .even
  16180.  
  16181. mml_sc88_drum_name:            *[SC88_DRUM_NAME]
  16182.     bsr    get_map_devid_ifn    *>d2=DEV ID,d3=map number
  16183.     bsr    gs_id_set
  16184.     moveq.l    #exclusive_zmd,d0
  16185.     bsr    do_wrt_trk_b
  16186.     moveq.l    #MKID_ROLAND,d0
  16187.     bsr    do_wrt_trk_b
  16188.     moveq.l    #15,d1
  16189.     lea    sct_sc88_drmname(pc),a1
  16190.     lea    do_wrt_trk_b(pc),a2
  16191.     bsr    wrt_comment        *コメント書き出し
  16192.     bsr    do_sc88drmnm        *送信パケット生成 > d1.l=packet length
  16193.     bra    set_rdexml
  16194.  
  16195. sc88_drum_name:                *.SC88_DRUM_NAME
  16196. *    bsr    check_relation_cmn    *コマンド関係チェック
  16197.     moveq.l    #CMN_MIDI_TRANSMISSION,d0
  16198.     bsr    do_wrt_cmn_b
  16199.     bsr    get_map_devid_ifn    *d1=I/F number,d2=DEV ID,d3=map number
  16200.     move.l    d1,d0
  16201.     bsr    do_wrt_cmn_b        *I/F number
  16202.     moveq.l    #15,d1
  16203.     lea    sct_sc88_drmname(pc),a1
  16204.     lea    do_wrt_cmn_b(pc),a2
  16205.     bsr    wrt_comment        *コメント書き出し
  16206.     bsr    do_sc88drmnm        *送信パケット生成 > d1.l=packet length
  16207.     bra    set_rdexshp
  16208.  
  16209. do_sc88drmnm:                *SC88ドラムセットの名前の設定
  16210.     * < d2=DEV ID
  16211.     * < d3=MAP NUMBER(0,1/$80+0,1)    $80+はUERケース
  16212.     * > temp_buffer
  16213.     * > d1=packet length(1~)
  16214.     * x d0-d3/a1-a2
  16215.     move.l    temp_buffer(pc),a2
  16216.     move.w    #$f041,(a2)+
  16217.     move.b    d2,(a2)+        *set dev ID
  16218.     move.b    #$42,(a2)+        *set model id
  16219.     move.l    #$12_410000,d1
  16220.     bclr.l    #7,d3
  16221.     bne    2f            *user case
  16222.     tst.b    d3            *preset case
  16223.     beq    @f
  16224.     move.w    #$1000,d1
  16225.     moveq.l    #$51,d3            *address sum
  16226.     bra    1f
  16227. @@:
  16228.     moveq.l    #$41,d3            *address sum
  16229. 1:
  16230.     move.l    d1,(a2)+        *cmd,addr
  16231.     moveq.l    #12,d1            *最大文字列長
  16232.     bsr    get_string_param    *""で囲まれた文字列の取得(< d1 n of data/> d1=n of data)
  16233.     moveq.l    #12-1,d1
  16234.     bra    set_arry_data
  16235. 2:                    *USER
  16236.     move.l    #$12_210000,d1
  16237.     tst.b    d3
  16238.     beq    @f
  16239.     move.w    #$1000,d1
  16240.     moveq.l    #$31,d3            *address sum
  16241.     bra    1b
  16242. @@:
  16243.     moveq.l    #$21,d3            *address sum
  16244.     bra    1b
  16245.  
  16246. get_string_param2:            *文字列取得({...}の中に設定されるべき場合)
  16247.     * < d1.l=required n of data(この個数よりも少なかった場合はSPCで埋める/多かったらエラー)
  16248.     * > d1.l=文字列長
  16249.     * > arry_stock
  16250.     * > d0.b=最後のキャラクター
  16251.     * - all
  16252. reglist    reg    d0/d2-d3/a1
  16253.     movem.l    reglist,-(sp)
  16254.     move.l    arry_stock(pc),a1
  16255.     bsr    skip_spc
  16256.     cmp.l    a4,d4
  16257.     bls    m_parameter_cannot_be_omitted
  16258.     move.b    (a4)+,d2        *end character
  16259.     cmpi.b    #"'",d2
  16260.     beq    @f
  16261.     cmpi.b    #'"',d2
  16262.     beq    @f
  16263.     bra    m_illegal_character    *始端記号が無い
  16264.  
  16265. get_string_param:            *文字列取得
  16266.     * < d1.l=required n of data(この個数よりも少なかった場合はSPCで埋める/多かったらエラー)
  16267.     * > d1.l=文字列長
  16268.     * > arry_stock
  16269.     * > d0.b=最後のキャラクター
  16270.     * - all
  16271.     movem.l    reglist,-(sp)
  16272.     move.l    arry_stock(pc),a1
  16273.     bsr    skip_eq
  16274.     cmp.l    a4,d4
  16275.     bls    m_parameter_cannot_be_omitted
  16276.     move.b    (a4)+,d2        *end character
  16277.     cmpi.b    #"'",d2
  16278.     beq    @f
  16279.     cmpi.b    #'"',d2
  16280.     beq    @f
  16281.     cmpi.b    #'{',d2
  16282.     bne    m_illegal_character    *始端記号が無い
  16283.     moveq.l    #'}',d2            *'{'で始まったら'}'で終わる
  16284. @@:
  16285.     move.l    d1,d3
  16286.     subq.w    #1,d3            *for dbra
  16287. gstplp:                    *get pattern name
  16288.     cmp.l    a4,d4
  16289.     bls    exit_gstplp
  16290.     move.b    (a4)+,d0
  16291.     bsr    chk_kanji
  16292.     bpl    @f
  16293.     move.b    d0,(a1)+        *以下、漢字の場合
  16294.     subq.w    #1,d3
  16295.     bcs    m_string_too_long    *文字列が長すぎる
  16296.     cmp.l    a4,d4
  16297.     bls    m_kanji_break_off    *漢字が途中で終わっている
  16298.     move.b    (a4)+,d0
  16299.     bra    st_gstpchr
  16300. @@:
  16301.     cmp.b    d2,d0
  16302.     beq    exit_gstplp
  16303.     cmpi.b    #' ',d0
  16304.     bcc    st_gstpchr
  16305.     moveq.l    #' ',d0            *コントロールコードはスペースへ変換
  16306. st_gstpchr:
  16307.     move.b    d0,(a1)+
  16308.     dbra    d3,gstplp
  16309.     cmp.l    a4,d4
  16310.     bls    1f
  16311.     cmp.b    (a4)+,d2
  16312.     bne    m_illegal_command_line
  16313.     bra    1f
  16314.  
  16315. exit_gstplp:
  16316.     sub.w    d3,d1
  16317.     subq.w    #1,d1            *戻り値(文字列実際長)
  16318. @@:                    *指定長に満たない場合はスペースで補填
  16319.     move.b    #' ',(a1)+
  16320.     dbra    d3,@b
  16321. 1:
  16322.     movem.l    (sp)+,reglist
  16323.     rts
  16324.  
  16325. mml_gs_display:                *[GS_DISPLAY]([SC55_DISPLAY])
  16326.     moveq.l    #$10,d1            *omitted case value
  16327.     bsr    get_devid_ifn        *>d2=DEV ID
  16328.     bsr    sc55_id_set
  16329.     moveq.l    #exclusive_zmd,d0
  16330.     bsr    do_wrt_trk_b
  16331.     moveq.l    #MKID_ROLAND,d0
  16332.     bsr    do_wrt_trk_b
  16333.     moveq.l    #10,d1
  16334.     lea    sct_gs_dsply(pc),a1
  16335.     lea    do_wrt_trk_b(pc),a2
  16336.     bsr    wrt_comment        *コメント書き出し
  16337.     bsr    do_gsdsply        *送信パケット生成 > d1.l=packet length
  16338.     bra    set_rdexml
  16339.  
  16340. gs_display:                *.GS_DISPLAY(SC55_DISPLAY)
  16341. *    bsr    check_relation_cmn    *コマンド関係チェック
  16342.     moveq.l    #CMN_MIDI_TRANSMISSION,d0
  16343.     bsr    do_wrt_cmn_b
  16344.     moveq.l    #$10,d1            *omitted case value
  16345.     bsr    get_devid_ifn        *d1=I/F number,d2=DEV ID
  16346.     move.l    d1,d0
  16347.     bsr    do_wrt_cmn_b        *I/F number
  16348.     moveq.l    #10,d1
  16349.     lea    sct_gs_dsply(pc),a1
  16350.     lea    do_wrt_cmn_b(pc),a2
  16351.     bsr    wrt_comment        *コメント書き出し
  16352.     bsr    do_gsdsply        *送信パケット生成 > d1.l=packet length
  16353.     bra    set_rdexshp
  16354.  
  16355. do_gsdsply:                *GSデイスプレイパラメータ取得&MIDIメッセージ作成
  16356.     * < d2=DEV ID
  16357.     * > temp_buffer
  16358.     * > d1=packet length(1~)
  16359.     * x d0-d3/a1-a2
  16360.     move.l    temp_buffer(pc),a2
  16361.     move.w    #$f041,(a2)+
  16362.     move.b    d2,(a2)+        *set dev ID
  16363.     move.b    #$45,(a2)+        *set model id
  16364.     move.l    #$12_100100,(a2)+    *cmd,addr
  16365.     moveq.l    #16,d1
  16366.     suba.l    a1,a1
  16367.     bsr    get_arry_params_w    *{}で囲まれた数値の取得(< d1 n of data/> d1=n of data)
  16368.     cmpi.l    #16,d1
  16369.     bne    m_illegal_parameter_format    *パラメータは必ず16個
  16370.     move.l    arry_stock(pc),a1
  16371.     moveq.l    #$11,d3            *address sum
  16372.     moveq.l    #16-1,d2
  16373. @@:
  16374.     move.w    (a1)+,d1
  16375.     move.b    d1,d0
  16376.     lsl.b    #4,d0
  16377.     andi.b    #$10,d0
  16378.     move.b    d0,48(a2)
  16379.     add.b    d0,d3            *calc sum
  16380.     move.w    d1,d0
  16381.     lsr.w    #1,d0
  16382.     andi.b    #$1f,d0
  16383.     move.b    d0,32(a2)
  16384.     add.b    d0,d3            *calc sum
  16385.     move.w    d1,d0
  16386.     lsr.w    #6,d0
  16387.     andi.b    #$1f,d0
  16388.     move.b    d0,16(a2)
  16389.     add.b    d0,d3            *calc sum
  16390.     rol.w    #5,d1            *same as lsr.w    #11,d1
  16391.     andi.b    #$1f,d1
  16392.     move.b    d1,(a2)+
  16393.     add.b    d1,d3            *calc sum
  16394.     dbra    d2,@b
  16395.     add.w    #48,a2
  16396.     bra    calcset_exsm
  16397.  
  16398. get_arry_params_w:                *データ列認識
  16399.     * < d1.l=required n of data(この個数よりも少なかった場合は0で埋める/多かったらエラー)
  16400.     * < a1.l=limit value table
  16401.     * > arry_stock
  16402.     * > d1.l=usable n of data
  16403.     movem.l    d2-d3/d5-d6/a1-a2,-(sp)
  16404.     moveq.l    #0,d5                *default min
  16405.     move.l    #65535,d6            *default max
  16406.     move.l    d1,d2
  16407.     move.l    arry_stock(pc),a2
  16408.     bsr    chk_num
  16409.     bpl    @f
  16410.     bsr    skip_eq
  16411.     cmp.l    a4,d4
  16412.     bls    m_parameter_cannot_be_omitted
  16413.     cmpi.b    #'{',(a4)+
  16414.     seq    d3                *終端マーク
  16415.     bne    m_parameter_cannot_be_omitted
  16416.     bsr    chk_num
  16417.     bmi    m_parameter_cannot_be_omitted
  16418. gtarprmw_lp:
  16419.     moveq.l    #0,d1                *省略時の値
  16420.     bsr    chk_num
  16421.     bpl    @f
  16422.     cmp.l    a4,d4
  16423.     bls    exit_gtarprmw_lp
  16424.     cmpi.b    #',',(a4)            *','の場合は値省略とする
  16425.     beq    gtarprmw_nmldt
  16426.     bra    exit_gtarprmw_lp        *','以外のものがあるという事はもう数値は続かないという事
  16427. @@:
  16428.     bsr    get_num
  16429.     move.l    a1,d0
  16430.     beq    1f                *no check
  16431.     cmp.l    #-32768,4(a1)            *min check
  16432.     beq    @f
  16433.     move.l    (a1)+,d5
  16434. @@:
  16435.     cmp.l    d5,d1
  16436.     blt    m_illegal_parameter_value
  16437. 1:
  16438.     move.l    a1,d0
  16439.     beq    1f                *no check
  16440.     cmp.l    #-32768,4(a1)            *max check
  16441.     beq    @f
  16442.     move.l    (a1)+,d6
  16443. @@:
  16444.     cmp.l    d6,d1
  16445.     bgt    m_illegal_parameter_value
  16446. 1:
  16447. gtarprmw_nmldt:
  16448.     bsr    skip_sep
  16449.     subq.l    #1,d2
  16450.     bcs    m_too_many_parameters        *パラメータが指定個数以上あってはならない
  16451.     move.w    d1,(a2)+
  16452.     bra    gtarprmw_lp
  16453. exit_gtarprmw_lp:
  16454.     move.l    a2,d1
  16455.     sub.l    arry_stock(pc),d1        *実質パラメータ個数
  16456.     lsr.l    #1,d1                *個数値に変換
  16457.     tst.l    d2
  16458.     beq    exit_gtarprmw
  16459. @@:                        *足りないパラメータは0で埋める
  16460.     clr.w    (a2)+
  16461.     subq.l    #1,d2
  16462.     bne    @b
  16463. exit_gtarprmw:
  16464.     tst.b    d3                *終端括弧いらないケース=0
  16465.     beq    @f
  16466.     cmpi.b    #'}',(a4)+
  16467.     bne    m_illegal_command_line        *終端記号が無い
  16468. @@:
  16469.     movem.l    (sp)+,d2-d3/d5-d6/a1-a2
  16470.     rts
  16471.  
  16472. mml_gm_system_on:            *[GM_SYSTEM_ON]
  16473.     moveq.l    #midi_transmission_zmd,d0
  16474.     bsr    do_wrt_trk_b
  16475.     moveq.l    #12,d1
  16476.     lea    sct_gm_syson(pc),a1
  16477.     lea    do_wrt_trk_b(pc),a2
  16478.     bsr    wrt_comment
  16479.     moveq.l    #6,d0
  16480.     bsr    do_wrt_trk_l        *データ長
  16481.     move.l    #$f07e7f09,d0
  16482.     bsr    do_wrt_trk_l        *転送データ
  16483.     move.w    #$01f7,d0
  16484.     bra    do_wrt_trk_w        *転送データ
  16485.  
  16486. gm_system_on:                *.GM_SYSTEM_ON
  16487. *    bsr    check_relation_cmn    *コマンド関係チェック
  16488.     moveq.l    #CMN_MIDI_TRANSMISSION,d0
  16489.     bsr    do_wrt_cmn_b
  16490.     bsr    get_ifn            *d1=I/F number,d2=DEV ID
  16491.     move.l    d1,d0
  16492.     bsr    do_wrt_cmn_b        *I/F number
  16493.     moveq.l    #12,d1
  16494.     lea    sct_gm_syson(pc),a1
  16495.     lea    do_wrt_cmn_b(pc),a2
  16496.     bsr    wrt_comment
  16497.     moveq.l    #6,d0
  16498.     bsr    do_wrt_cmn_l        *データ長
  16499.     move.l    #$f07e7f09,d0
  16500.     bsr    do_wrt_cmn_l        *転送データ
  16501.     move.w    #$01f7,d0
  16502.     bsr    do_wrt_cmn_w        *転送データ
  16503.     jmp    cmpl_lp
  16504.  
  16505. mml_sc88_mode:                *[SC88_MODE]
  16506.     bsr    get_mode_devid_ifn    *>d3=mode
  16507.     bsr    gs_id_set
  16508.     moveq.l    #exclusive_zmd,d0
  16509.     bsr    do_wrt_trk_b
  16510.     moveq.l    #MKID_ROLAND,d0
  16511.     bsr    do_wrt_trk_b
  16512.     moveq.l    #9,d1
  16513.     lea    sct_sc88_mode(pc),a1
  16514.     lea    do_wrt_trk_b(pc),a2
  16515.     bsr    wrt_comment
  16516.     moveq.l    #4,d0
  16517.     bsr    do_wrt_trk_l        *データ長
  16518.     move.l    #$0000_7f00,d0
  16519.     move.b    d3,d0            *mode(0,1)
  16520.     bra    do_wrt_trk_l        *転送データ
  16521.  
  16522. sc88_mode:                *.SC88_MODE
  16523. *    bsr    check_relation_cmn    *コマンド関係チェック
  16524.     moveq.l    #CMN_MIDI_TRANSMISSION,d0
  16525.     bsr    do_wrt_cmn_b
  16526.     bsr    get_mode_devid_ifn    *d1=I/F number,d2=DEV ID,d3=mode
  16527.     move.l    d1,d0
  16528.     bsr    do_wrt_cmn_b        *I/F number
  16529.     moveq.l    #9,d1
  16530.     lea    sct_sc88_mode(pc),a1
  16531.     lea    do_wrt_cmn_b(pc),a2
  16532.     bsr    wrt_comment
  16533.     moveq.l    #11,d0
  16534.     bsr    do_wrt_cmn_l        *データ長
  16535.     move.l    #$f041_0042,d0
  16536.     lsl.w    #8,d2            *dev ID
  16537.     or.w    d2,d0
  16538.     bsr    do_wrt_cmn_l        *header
  16539.     move.l    #$12_00007f,d0
  16540.     bsr    do_wrt_cmn_l        *cmd,addr
  16541.     tst.b    d3
  16542.     bne    @f
  16543.     move.w    #$0001,d0        *mode,checksum
  16544.     bsr    do_wrt_cmn_w
  16545.     moveq.l    #$f7,d0            *EOX
  16546.     bsr    do_wrt_cmn_b
  16547.     jmp    cmpl_lp
  16548. @@:
  16549.     move.w    #$0100,d0        *mode,checksum
  16550.     bsr    do_wrt_cmn_w
  16551.     moveq.l    #$f7,d0            *EOX
  16552.     bsr    do_wrt_cmn_b
  16553.     jmp    cmpl_lp
  16554.  
  16555. mml_mt32_reset:                *[MT32_RESET]
  16556.     moveq.l    #$10,d1            *omitted case value
  16557.     bsr    get_devid_ifn        *>d2=DEV ID
  16558.     bsr    mt32_id_set
  16559.     moveq.l    #exclusive_zmd,d0
  16560.     bsr    do_wrt_trk_b
  16561.     moveq.l    #MKID_ROLAND,d0
  16562.     bsr    do_wrt_trk_b
  16563.     moveq.l    #10,d1
  16564.     lea    sct_mt32reset(pc),a1
  16565.     lea    do_wrt_trk_b(pc),a2
  16566.     bsr    wrt_comment
  16567.     moveq.l    #4,d0
  16568.     bsr    do_wrt_trk_l        *データ長
  16569.     move.l    #$7f0000_00,d0
  16570.     bra    do_wrt_trk_l        *転送データ
  16571.  
  16572. mt32_reset:                *.MT32_INIT
  16573. *    bsr    check_relation_cmn    *コマンド関係チェック
  16574.     moveq.l    #CMN_MIDI_TRANSMISSION,d0
  16575.     bsr    do_wrt_cmn_b
  16576.     moveq.l    #$10,d1            *omitted case value
  16577.     bsr    get_devid_ifn        *d1=I/F number,d2=DEV ID
  16578.     move.l    d1,d0
  16579.     bsr    do_wrt_cmn_b        *I/F number
  16580.     moveq.l    #10,d1
  16581.     lea    sct_mt32reset(pc),a1
  16582.     lea    do_wrt_cmn_b(pc),a2
  16583.     bsr    wrt_comment
  16584.     moveq.l    #11,d0
  16585.     bsr    do_wrt_cmn_l        *データ長
  16586.     lea    header(pc),a1        *送信パック作成
  16587.     move.b    d2,2(a1)        *dev ID
  16588.     move.b    #$16,3(a1)        *model ID
  16589.     move.b    #$7f,5(a1)
  16590.     move.l    #$0000_0001,6(a1)
  16591.     moveq.l    #11-1,d1
  16592. @@:                    *データ本体の書き込み
  16593.     move.b    (a1)+,d0
  16594.     bsr    do_wrt_cmn_b
  16595.     dbra    d1,@b
  16596.     jmp    cmpl_lp
  16597.  
  16598. mml_mt32_partial_reserve:        *[MT32_PARTIAL_RESERVE]
  16599.     moveq.l    #$10,d1            *omitted case value
  16600.     bsr    get_devid_ifn        *>d2=DEV ID
  16601.     bsr    mt32_id_set
  16602.     moveq.l    #exclusive_zmd,d0
  16603.     bsr    do_wrt_trk_b
  16604.     moveq.l    #MKID_ROLAND,d0
  16605.     bsr    do_wrt_trk_b
  16606.     moveq.l    #20,d1
  16607.     lea    sct_mt32prsv(pc),a1
  16608.     lea    do_wrt_trk_b(pc),a2
  16609.     bsr    wrt_comment        *コメント書き出し
  16610.     bsr    do_mt32ptlrsv        *送信パケット生成
  16611.     moveq.l    #3+9,d0
  16612.     bsr    do_wrt_trk_l        *データ長
  16613.     move.l    temp_buffer(pc),a1
  16614.     moveq.l    #3+9-1,d1
  16615. @@:
  16616.     move.b    (a1)+,d0
  16617.     bsr    do_wrt_trk_b
  16618.     dbra    d1,@b
  16619.     rts
  16620.  
  16621. mt32_partial_reserve:            *.MT32_PARTIAL_RESERVE(SC55ボイスリザーブ)
  16622. *    bsr    check_relation_cmn    *コマンド関係チェック
  16623.     moveq.l    #CMN_MIDI_TRANSMISSION,d0
  16624.     bsr    do_wrt_cmn_b
  16625.     moveq.l    #$10,d1            *omitted case value
  16626.     bsr    get_devid_ifn        *d1=I/F number,d2=DEV ID
  16627.     move.l    d1,d0
  16628.     bsr    do_wrt_cmn_b        *I/F number
  16629.     moveq.l    #20,d1
  16630.     lea    sct_mt32prsv(pc),a1
  16631.     lea    do_wrt_cmn_b(pc),a2
  16632.     bsr    wrt_comment        *コメント書き出し
  16633.     bsr    do_mt32ptlrsv        *送信パケット生成
  16634.     move.l    #8+9+2,d0
  16635.     bsr    do_wrt_cmn_l        *データ長
  16636.     move.l    temp_buffer(pc),a1
  16637.     moveq.l    #8+9+2-1,d1
  16638. @@:
  16639.     move.b    (a1)+,d0
  16640.     bsr    do_wrt_cmn_b
  16641.     dbra    d1,@b
  16642.     jmp    cmpl_lp
  16643.  
  16644. do_mt32ptlrsv:            *MT32パーシャルリザーブパラメータ取得&MIDIメッセージ作成
  16645.     * < d2=DEV ID
  16646.     * > temp_buffer
  16647.     * x d0-d3/a1-a2
  16648.     move.l    temp_buffer(pc),a2
  16649.     move.w    #$f041,(a2)+
  16650.     move.b    d2,(a2)+        *set dev ID
  16651.     move.b    #$42,(a2)+        *set model id
  16652.     move.l    #$12_10004,(a2)+    *cmd,addr
  16653.     moveq.l    #9,d1
  16654.     suba.l    a1,a1
  16655.     bsr    get_arry_params        *{}で囲まれた数値の取得 (< d1 n of data/> d1=n of data)
  16656.     subq.l    #1,d1
  16657.     cmpi.l    #8,d1
  16658.     bne    m_illegal_parameter_format    *パラメータは必ず9個
  16659.     moveq.l    #9-1,d1
  16660.     moveq.l    #$14,d3            *address sum
  16661.     bra    set_arry_data
  16662.  
  16663. mml_mt32_reverb:            *[MT32_REVERB]
  16664.     moveq.l    #$10,d1            *omitted case value
  16665.     bsr    get_devid_ifn        *>d2=DEV ID
  16666.     bsr    mt32_id_set
  16667.     moveq.l    #exclusive_zmd,d0
  16668.     bsr    do_wrt_trk_b
  16669.     moveq.l    #MKID_ROLAND,d0
  16670.     bsr    do_wrt_trk_b
  16671.     moveq.l    #11,d1
  16672.     lea    sct_mt32rvb(pc),a1
  16673.     lea    do_wrt_trk_b(pc),a2
  16674.     bsr    wrt_comment        *コメント書き出し
  16675.     bsr    do_mt32rvb        *送信パケット生成 > d1.l=packet length
  16676.     bra    set_rdexml
  16677.  
  16678. mt32_reverb:                *.MT32_REVERB
  16679. *    bsr    check_relation_cmn    *コマンド関係チェック
  16680.     moveq.l    #CMN_MIDI_TRANSMISSION,d0
  16681.     bsr    do_wrt_cmn_b
  16682.     moveq.l    #$10,d1            *omitted case value
  16683.     bsr    get_devid_ifn        *d1=I/F number,d2=DEV ID
  16684.     move.l    d1,d0
  16685.     bsr    do_wrt_cmn_b        *I/F number
  16686.     moveq.l    #11,d1
  16687.     lea    sct_mt32rvb(pc),a1
  16688.     lea    do_wrt_cmn_b(pc),a2
  16689.     bsr    wrt_comment        *コメント書き出し
  16690.     bsr    do_mt32rvb        *送信パケット生成 > d1.l=packet length
  16691.     bra    set_rdexshp
  16692.  
  16693. do_mt32rvb:                *MT32リバーブパラメータ取得&MIDIメッセージ作成
  16694.     * < d2=DEV ID
  16695.     * > temp_buffer
  16696.     * > d1=packet length(1~)
  16697.     * x d0-d3/a1-a2
  16698.     move.l    temp_buffer(pc),a2
  16699.     move.w    #$f041,(a2)+
  16700.     move.b    d2,(a2)+        *set dev ID
  16701.     move.b    #$16,(a2)+        *set model id
  16702.     move.l    #$12_100001,(a2)+    *cmd,addr
  16703.     moveq.l    #3,d1
  16704.     lea    mt32rvb_limit(pc),a1
  16705.     bsr    get_arry_params        *{}で囲まれた数値の取得(< d1 n of data/> d1=n of data)
  16706.     subq.l    #1,d1
  16707.     bcs    m_parameter_cannot_be_omitted    *パラメータは最低1個
  16708.     moveq.l    #$11,d3
  16709.     bra    set_arry_data
  16710.  
  16711. mt32rvb_limit:    dc.b    0,3,0,7,0,7,-1
  16712.     .even
  16713.  
  16714. mml_mt32_part_setup:            *[MT32_PART_SETUP]
  16715.     moveq.l    #$10,d1            *omitted case value
  16716.     bsr    get_devid_ifn        *>d2=DEV ID
  16717.     bsr    mt32_id_set
  16718.     moveq.l    #exclusive_zmd,d0
  16719.     bsr    do_wrt_trk_b
  16720.     moveq.l    #MKID_ROLAND,d0
  16721.     bsr    do_wrt_trk_b
  16722.     moveq.l    #15,d1
  16723.     lea    sct_mt32ptstup(pc),a1
  16724.     lea    do_wrt_trk_b(pc),a2
  16725.     bsr    wrt_comment        *コメント書き出し
  16726.     bsr    do_mt32ptstup        *送信パケット生成 > d1.l=packet length
  16727.     bra    set_rdexml
  16728.  
  16729. mt32_part_setup:            *.MT32_PART_SETUP
  16730. *    bsr    check_relation_cmn    *コマンド関係チェック
  16731.     moveq.l    #CMN_MIDI_TRANSMISSION,d0
  16732.     bsr    do_wrt_cmn_b
  16733.     moveq.l    #$10,d1            *omitted case value
  16734.     bsr    get_devid_ifn        *d1=I/F number,d2=DEV ID
  16735.     move.l    d1,d0
  16736.     bsr    do_wrt_cmn_b        *I/F number
  16737.     moveq.l    #15,d1
  16738.     lea    sct_mt32ptstup(pc),a1
  16739.     lea    do_wrt_cmn_b(pc),a2
  16740.     bsr    wrt_comment        *コメント書き出し
  16741.     bsr    do_mt32ptstup        *送信パケット生成 > d1.l=packet length
  16742.     bra    set_rdexshp
  16743.  
  16744. do_mt32ptstup:                *MT32パートセットアップパラメータ取得&MIDIメッセージ作成
  16745.     * < d2=DEV ID
  16746.     * > temp_buffer
  16747.     * > d1=packet length(1~)
  16748.     * x d0-d3/a1-a2
  16749.     move.l    temp_buffer(pc),a2
  16750.     move.w    #$f041,(a2)+
  16751.     move.b    d2,(a2)+        *set dev ID
  16752.     move.b    #$16,(a2)+        *set model id
  16753.     move.l    #$12_10000d,(a2)+    *cmd,addr
  16754.     moveq.l    #9,d1
  16755.     suba.l    a1,a1
  16756.     bsr    get_arry_params        *{}で囲まれた数値の取得(< d1 n of data/> d1=n of data)
  16757.     subq.l    #1,d1
  16758.     bcs    m_parameter_cannot_be_omitted    *パラメータは最低1個
  16759.     move.l    arry_stock(pc),a1
  16760.     moveq.l    #$1d,d3
  16761. domt32ptstuplp:
  16762.     move.b    (a1)+,d0
  16763.     cmpi.b    #$0f,d0
  16764.     bls    @f
  16765.     moveq.l    #$10,d0            *0-15以外はOFFとみなす
  16766. @@:
  16767.     add.b    d0,d3
  16768.     move.b    d0,(a2)+
  16769.     dbra    d1,domt32ptstuplp
  16770.     bra    calcset_exsm
  16771.  
  16772. mml_mt32_drum_setup:            *[MT32_DRUM_SETUP]
  16773.     bsr    get_ky_devid_ifn    *>d2=DEV ID,d3.w=key
  16774.     bsr    mt32_id_set
  16775.     moveq.l    #exclusive_zmd,d0
  16776.     bsr    do_wrt_trk_b
  16777.     moveq.l    #MKID_ROLAND,d0
  16778.     bsr    do_wrt_trk_b
  16779.     moveq.l    #15,d1
  16780.     lea    sct_mt32drmstup(pc),a1
  16781.     lea    do_wrt_trk_b(pc),a2
  16782.     bsr    wrt_comment        *コメント書き出し
  16783.     bsr    do_mt32drmstup        *送信パケット生成 > d1.l=packet length
  16784.     bra    set_rdexml
  16785.  
  16786. mt32_drum_setup:            *.MT32_DRUM_SETUP
  16787. *    bsr    check_relation_cmn    *コマンド関係チェック
  16788.     moveq.l    #CMN_MIDI_TRANSMISSION,d0
  16789.     bsr    do_wrt_cmn_b
  16790.     bsr    get_ky_devid_ifn    *d1=I/F number,d2=DEV ID,d3.w=key
  16791.     move.l    d1,d0
  16792.     bsr    do_wrt_cmn_b        *I/F number
  16793.     moveq.l    #15,d1
  16794.     lea    sct_mt32drmstup(pc),a1
  16795.     lea    do_wrt_cmn_b(pc),a2
  16796.     bsr    wrt_comment        *コメント書き出し
  16797.     bsr    do_mt32drmstup        *送信パケット生成 > d1.l=packet length
  16798.     bra    set_rdexshp
  16799.  
  16800. do_mt32drmstup:                *MT32リズムセットアップパラメータ取得&MIDIメッセージ作成
  16801.     * < d2=DEV ID
  16802.     * < d3=key number(0-127)
  16803.     * > temp_buffer
  16804.     * > d1=packet length(1~)
  16805.     * x d0-d3/a1-a2
  16806.     move.l    #$12_030110,d5
  16807.     add.w    d3,d3
  16808.     add.w    d3,d3
  16809.     add.w    d3,d5
  16810.     bclr.l    #7,d5
  16811.     beq    @f
  16812.     add.w    #$0100,d5
  16813. @@:
  16814.     move.l    temp_buffer(pc),a2
  16815.     move.w    #$f041,(a2)+
  16816.     move.b    d2,(a2)+        *set dev ID
  16817.     move.b    #$16,(a2)+        *set model id
  16818.     move.l    d5,(a2)+        *cmd,addr
  16819.     moveq.l    #4,d1
  16820.     lea    mt32drmstup_limit(pc),a1
  16821.     bsr    get_arry_params        *{}で囲まれた数値の取得(< d1 n of data/> d1=n of data)
  16822.     subq.l    #1,d1
  16823.     bcs    m_parameter_cannot_be_omitted    *パラメータは最低1個
  16824.     swap    d5
  16825.     move.b    d5,d3
  16826.     swap    d5
  16827.     ror.w    #8,d5
  16828.     add.b    d5,d3
  16829.     ror.w    #8,d5
  16830.     add.b    d5,d3            *d3=address sum
  16831.     bra    set_arry_data
  16832.  
  16833. mt32drmstup_limit:    dc.b    0,127,0,100,0,14,0,1,-1
  16834.     .even
  16835.  
  16836. mml_mt32_common:            *[MT32_COMMON]
  16837.     bsr    get_tm_devid_ifn    *>d2=DEV ID,d3.w=timbre number
  16838.     bsr    mt32_id_set
  16839.     moveq.l    #exclusive_zmd,d0
  16840.     bsr    do_wrt_trk_b
  16841.     moveq.l    #MKID_ROLAND,d0
  16842.     bsr    do_wrt_trk_b
  16843.     moveq.l    #11,d1
  16844.     lea    sct_mt32cmn(pc),a1
  16845.     lea    do_wrt_trk_b(pc),a2
  16846.     bsr    wrt_comment        *コメント書き出し
  16847.     bsr    do_mt32cmn        *送信パケット生成 > d1.l=packet length
  16848.     bra    set_rdexml
  16849.  
  16850. mt32_common:                *.MT32_COMMON
  16851. *    bsr    check_relation_cmn    *コマンド関係チェック
  16852.     moveq.l    #CMN_MIDI_TRANSMISSION,d0
  16853.     bsr    do_wrt_cmn_b
  16854.     bsr    get_tm_devid_ifn    *d1=I/F number,d2=DEV ID,d3.w=timbre number
  16855.     move.l    d1,d0
  16856.     bsr    do_wrt_cmn_b        *I/F number
  16857.     moveq.l    #11,d1
  16858.     lea    sct_mt32cmn(pc),a1
  16859.     lea    do_wrt_cmn_b(pc),a2
  16860.     bsr    wrt_comment        *コメント書き出し
  16861.     bsr    do_mt32cmn        *送信パケット生成 > d1.l=packet length
  16862.     bra    set_rdexshp
  16863.  
  16864. do_mt32cmn:                *MT32コモンパラメータ取得&MIDIメッセージ作成
  16865.     * < d2=DEV ID
  16866.     * < d3=timbre number(0-63)
  16867.     * > temp_buffer
  16868.     * > d1=packet length(1~)
  16869.     * x d0-d3/a1-a2
  16870.     move.l    #$12_080000,d5
  16871.     ror.w    #7,d3
  16872.     move.w    d3,d5
  16873.     move.l    temp_buffer(pc),a2
  16874.     move.w    #$f041,(a2)+
  16875.     move.b    d2,(a2)+        *set dev ID
  16876.     move.b    #$16,(a2)+        *set model id
  16877.     move.l    d5,(a2)+        *cmd,addr
  16878.     swap    d5
  16879.     move.b    d5,d3
  16880.     swap    d5
  16881.     ror.w    #8,d5
  16882.     add.b    d5,d3
  16883.     ror.w    #8,d5
  16884.     add.b    d5,d3            *d3=address sum
  16885.     moveq.l    #10,d1            *10文字分ほしい(足りない分は' 'で埋めてもらえる)
  16886.     bsr    get_string_param2
  16887.     moveq.l    #10-1,d1
  16888.     move.l    arry_stock(pc),a1
  16889. @@:
  16890.     move.b    (a1)+,d0
  16891.     add.b    d0,d3
  16892.     move.b    d0,(a2)+        *文字パラメータ
  16893.     dbra    d1,@b
  16894.     moveq.l    #4,d1
  16895.     lea    mt32cmn_limit(pc),a1
  16896.     bsr    get_arry_params        *{}で囲まれた数値の取得(< d1 n of data/> d1=n of data)
  16897.     move.l    arry_stock(pc),a1
  16898.     subq.l    #1,d1
  16899.     bcs    m_parameter_cannot_be_omitted    *パラメータは最低1個
  16900. @@:
  16901.     move.b    (a1)+,d0
  16902.     add.b    d0,d3
  16903.     move.b    d0,(a2)+
  16904.     dbra    d1,@b
  16905.     bra    calcset_exsm
  16906.  
  16907. mt32cmn_limit:    dc.b    0,12,0,12,0,15,0,1,-1
  16908.     .even
  16909.  
  16910. mml_mt32_partial:            *[MT32_PARTIAL]
  16911.     bsr    get_tm_pt_devid_ifn    *>d2=DEV ID,d3.hw=timbre,d3.lw=partial
  16912.     bsr    mt32_id_set
  16913.     moveq.l    #exclusive_zmd,d0
  16914.     bsr    do_wrt_trk_b
  16915.     moveq.l    #MKID_ROLAND,d0
  16916.     bsr    do_wrt_trk_b
  16917.     moveq.l    #12,d1
  16918.     lea    sct_mt32ptl(pc),a1
  16919.     lea    do_wrt_trk_b(pc),a2
  16920.     bsr    wrt_comment        *コメント書き出し
  16921.     bsr    do_mt32ptl        *送信パケット生成 > d1.l=packet length
  16922.     bra    set_rdexml
  16923.  
  16924. mt32_partial:                *.MT32_PARTIAL
  16925. *    bsr    check_relation_cmn    *コマンド関係チェック
  16926.     moveq.l    #CMN_MIDI_TRANSMISSION,d0
  16927.     bsr    do_wrt_cmn_b
  16928.     bsr    get_tm_pt_devid_ifn    *d1=I/F number,d2=DEV ID,d3.hw=timbre,d3.lw=partial
  16929.     move.l    d1,d0
  16930.     bsr    do_wrt_cmn_b        *I/F number
  16931.     moveq.l    #12,d1
  16932.     lea    sct_mt32ptl(pc),a1
  16933.     lea    do_wrt_cmn_b(pc),a2
  16934.     bsr    wrt_comment        *コメント書き出し
  16935.     bsr    do_mt32ptl        *送信パケット生成 > d1.l=packet length
  16936.     bra    set_rdexshp
  16937.  
  16938. do_mt32ptl:                *MT32パーシャルパラメータ取得&MIDIメッセージ作成
  16939.     * < d2=DEV ID
  16940.     * < d3.hw=timbre number(0-63)
  16941.     * < d3.lw=partial number(0-3)
  16942.     * > temp_buffer
  16943.     * > d1=packet length(1~)
  16944.     * x d0-d3/a1-a2
  16945.     move.l    #$12_080000,d5
  16946.     move.w    d3,d1
  16947.     swap    d3
  16948.     ext.w    d3
  16949.     ror.w    #7,d3
  16950.     move.w    d3,d5
  16951.     mulu    #58,d1
  16952.     add.w    #$0e,d1
  16953.     move.b    d1,d5
  16954.     andi.b    #$7f,d5
  16955.     add.w    d1,d1
  16956.     andi.w    #$7f00,d1
  16957.     add.w    d1,d5
  16958.     move.l    temp_buffer(pc),a2
  16959.     move.w    #$f041,(a2)+
  16960.     move.b    d2,(a2)+        *set dev ID
  16961.     move.b    #$16,(a2)+        *set model id
  16962.     move.l    d5,(a2)+        *cmd,addr
  16963.     moveq.l    #58,d1
  16964.     lea    mt32ptl_limit(pc),a1
  16965.     bsr    get_arry_params        *{}で囲まれた数値の取得(< d1 n of data/> d1=n of data)
  16966.     subq.l    #1,d1
  16967.     bcs    m_parameter_cannot_be_omitted    *パラメータは最低1個
  16968.     swap    d5
  16969.     move.b    d5,d3
  16970.     swap    d5
  16971.     ror.w    #8,d5
  16972.     add.b    d5,d3
  16973.     ror.w    #8,d5
  16974.     add.b    d5,d3            *d3=address sum
  16975.     bra    set_arry_data
  16976.  
  16977. mt32ptl_limit:
  16978.     dc.b    0,96
  16979.     dc.b    0,100
  16980.     dc.b    0,16
  16981.     dc.b    0,1
  16982.     dc.b    0,3
  16983.     dc.b    0,127
  16984.     dc.b    0,100
  16985.     dc.b    0,14
  16986.     dc.b    0,10
  16987.     dc.b    0,3
  16988.     dc.b    0,4
  16989.     rept    13
  16990.     dc.b    0,100
  16991.     endm
  16992.     dc.b    0,30
  16993.     dc.b    0,14
  16994.     dc.b    0,127
  16995.     dc.b    0,14
  16996.     dc.b    0,100
  16997.     dc.b    0,100
  16998.     dc.b    0,4
  16999.     dc.b    0,4
  17000.     rept    11
  17001.     dc.b    0,100
  17002.     endm
  17003.     dc.b    0,127
  17004.     dc.b    0,12
  17005.     dc.b    0,127
  17006.     dc.b    0,12
  17007.     dc.b    0,4
  17008.     dc.b    0,4
  17009.     rept    9
  17010.     dc.b    0,100
  17011.     endm
  17012.     dc.b    -1
  17013.     .even
  17014.  
  17015. mml_mt32_patch:                *[MT32_PATCH]
  17016.     bsr    get_ptch_devid_ifn    *>d2=DEV ID,d3.w=patch number
  17017.     bsr    mt32_id_set
  17018.     moveq.l    #exclusive_zmd,d0
  17019.     bsr    do_wrt_trk_b
  17020.     moveq.l    #MKID_ROLAND,d0
  17021.     bsr    do_wrt_trk_b
  17022.     moveq.l    #10,d1
  17023.     lea    sct_mt32ptch(pc),a1
  17024.     lea    do_wrt_trk_b(pc),a2
  17025.     bsr    wrt_comment        *コメント書き出し
  17026.     bsr    do_mt32ptch        *送信パケット生成 > d1.l=packet length
  17027.     bra    set_rdexml
  17028.  
  17029. mt32_patch:                *.MT32_PATCH
  17030. *    bsr    check_relation_cmn    *コマンド関係チェック
  17031.     moveq.l    #CMN_MIDI_TRANSMISSION,d0
  17032.     bsr    do_wrt_cmn_b
  17033.     bsr    get_ptch_devid_ifn    *d1=I/F number,d2=DEV ID,d3.w=patch number
  17034.     move.l    d1,d0
  17035.     bsr    do_wrt_cmn_b        *I/F number
  17036.     moveq.l    #10,d1
  17037.     lea    sct_mt32ptch(pc),a1
  17038.     lea    do_wrt_cmn_b(pc),a2
  17039.     bsr    wrt_comment        *コメント書き出し
  17040.     bsr    do_mt32ptch        *送信パケット生成 > d1.l=packet length
  17041.     bra    set_rdexshp
  17042.  
  17043. do_mt32ptch:                *MT32パッチパラメータ取得&MIDIメッセージ作成
  17044.     * < d2=DEV ID
  17045.     * < d3=timbre number(0-127)
  17046.     * > temp_buffer
  17047.     * > d1=packet length(1~)
  17048.     * x d0-d3/a1-a2
  17049.     move.l    #$12_050000,d5
  17050.     lsl.w    #3,d3            *d3=d3*8
  17051.     move.b    d3,d5
  17052.     andi.b    #$7f,d5
  17053.     add.w    d3,d3
  17054.     andi.w    #$7f00,d3
  17055.     add.w    d3,d5
  17056.     move.l    temp_buffer(pc),a2
  17057.     move.w    #$f041,(a2)+
  17058.     move.b    d2,(a2)+        *set dev ID
  17059.     move.b    #$16,(a2)+        *set model id
  17060.     move.l    d5,(a2)+        *cmd,addr
  17061.     moveq.l    #7,d1
  17062.     lea    mt32ptch_limit(pc),a1
  17063.     bsr    get_arry_params        *{}で囲まれた数値の取得(< d1 n of data/> d1=n of data)
  17064.     subq.l    #1,d1
  17065.     bcs    m_parameter_cannot_be_omitted    *パラメータは最低1個
  17066.     swap    d5
  17067.     move.b    d5,d3
  17068.     swap    d5
  17069.     ror.w    #8,d5
  17070.     add.b    d5,d3
  17071.     ror.w    #8,d5
  17072.     add.b    d5,d3            *d3=address sum
  17073.     bra    set_arry_data
  17074.  
  17075. mt32ptch_limit:    dc.b    0,3,0,63,0,48,0,100,0,24,0,3,0,1,-1
  17076.     .even
  17077.  
  17078. mml_mt32_print:                *[MT32_PRINT]
  17079.     moveq.l    #$10,d1            *omitted case value
  17080.     bsr    get_devid_ifn        *>d2=DEV ID
  17081.     bsr    mt32_id_set
  17082.     moveq.l    #exclusive_zmd,d0
  17083.     bsr    do_wrt_trk_b
  17084.     moveq.l    #MKID_ROLAND,d0
  17085.     bsr    do_wrt_trk_b
  17086.     moveq.l    #10,d1
  17087.     lea    sct_mt32prt(pc),a1
  17088.     lea    do_wrt_trk_b(pc),a2
  17089.     bsr    wrt_comment        *コメント書き出し
  17090.     bsr    do_mt32prt        *送信パケット生成 > d1.l=packet length
  17091.     bra    set_rdexml
  17092.  
  17093. mt32_print:                *.MT32_PRINT
  17094. *    bsr    check_relation_cmn    *コマンド関係チェック
  17095.     moveq.l    #CMN_MIDI_TRANSMISSION,d0
  17096.     bsr    do_wrt_cmn_b
  17097.     moveq.l    #$10,d1            *omitted case value
  17098.     bsr    get_devid_ifn        *d1=I/F number,d2=DEV ID
  17099.     move.l    d1,d0
  17100.     bsr    do_wrt_cmn_b        *I/F number
  17101.     moveq.l    #10,d1
  17102.     lea    sct_mt32prt(pc),a1
  17103.     lea    do_wrt_cmn_b(pc),a2
  17104.     bsr    wrt_comment        *コメント書き出し
  17105.     bsr    do_mt32prt        *送信パケット生成 > d1.l=packet length
  17106.     bra    set_rdexshp
  17107.  
  17108. do_mt32prt:                *MT32文字列出力パラメータ取得&MIDIメッセージ作成
  17109.     * < d2=DEV ID
  17110.     * > temp_buffer
  17111.     * > d1=packet length(1~)
  17112.     * x d0-d3/a1-a2
  17113.     move.l    temp_buffer(pc),a2
  17114.     move.w    #$f041,(a2)+
  17115.     move.b    d2,(a2)+        *set dev ID
  17116.     move.b    #$16,(a2)+        *set model id
  17117.     move.l    #$12_200000,(a2)+    *cmd,addr
  17118.     moveq.l    #20,d1            *最大文字列長
  17119.     bsr    get_string_param    *""で囲まれた文字列の取得(< d1 n of data/> d1=n of data)
  17120.     subq.l    #1,d1
  17121.     bcs    m_parameter_cannot_be_omitted    *パラメータは最低1個
  17122.     moveq.l    #$10,d3            *address sum
  17123.     bra    set_arry_data
  17124.  
  17125. mml_u220_setup:                *[U220_SETUP]
  17126.     moveq.l    #$10,d1            *omitted case value
  17127.     bsr    get_devid_ifn        *>d2=DEV ID
  17128.     bsr    u220_id_set
  17129.     moveq.l    #exclusive_zmd,d0
  17130.     bsr    do_wrt_trk_b
  17131.     moveq.l    #MKID_ROLAND,d0
  17132.     bsr    do_wrt_trk_b
  17133.     moveq.l    #10,d1
  17134.     lea    sct_u220stup(pc),a1
  17135.     lea    do_wrt_trk_b(pc),a2
  17136.     bsr    wrt_comment        *コメント書き出し
  17137.     bsr    do_u220stup        *送信パケット生成 > d1.l=packet length
  17138.     bra    set_rdexml
  17139.  
  17140. u220_setup:                *.U220_SETUP
  17141. *    bsr    check_relation_cmn    *コマンド関係チェック
  17142.     moveq.l    #CMN_MIDI_TRANSMISSION,d0
  17143.     bsr    do_wrt_cmn_b
  17144.     moveq.l    #$10,d1            *omitted case value
  17145.     bsr    get_devid_ifn        *d1=I/F number,d2=DEV ID
  17146.     move.l    d1,d0
  17147.     bsr    do_wrt_cmn_b        *I/F number
  17148.     moveq.l    #10,d1
  17149.     lea    sct_u220stup(pc),a1
  17150.     lea    do_wrt_cmn_b(pc),a2
  17151.     bsr    wrt_comment        *コメント書き出し
  17152.     bsr    do_u220stup        *送信パケット生成 > d1.l=packet length
  17153.     bra    set_rdexshp
  17154.  
  17155. do_u220stup:                *U220セットアップパラメータ取得&MIDIメッセージ作成
  17156.     * < d2=DEV ID
  17157.     * > temp_buffer
  17158.     * > d1=packet length(1~)
  17159.     * x d0-d3/a1-a2
  17160.     move.l    temp_buffer(pc),a2
  17161.     move.w    #$f041,(a2)+
  17162.     move.b    d2,(a2)+        *set dev ID
  17163.     move.b    #$2b,(a2)+        *set model id
  17164.     move.l    #$12_000000,d0
  17165.     move.l    d0,(a2)+        *cmd,addr
  17166.     moveq.l    #7,d1
  17167.     lea    u220stup_limit(pc),a1
  17168.     bsr    get_arry_params        *{}で囲まれた数値の取得(< d1 n of data/> d1=n of data)
  17169.     subq.l    #1,d1
  17170.     cmpi.l    #6,d1
  17171.     bne    m_illegal_parameter_format    *パラメータは必ず7個
  17172.     move.l    arry_stock(pc),a1
  17173.     move.l    #$0e07_0a00,d1
  17174.     moveq.l    #$0e+$07+$0a,d3            *address sum=0,data sum=$0e+$07+$0a
  17175.     moveq.l    #0,d0
  17176.     tst.b    (a1)+                *chorus sw
  17177.     beq    @f
  17178.     moveq.l    #2,d0
  17179. @@:
  17180.     or.b    d0,d1
  17181.     moveq.l    #0,d0
  17182.     tst.b    (a1)+                *reverb sw
  17183.     beq    @f
  17184.     moveq.l    #1,d0
  17185. @@:
  17186.     or.b    d0,d1
  17187.     move.l    d1,(a2)+            *440.0Hz,LCD=10,cho/rvb sw
  17188.     add.b    d1,d3                *下位バイトをSUMに加算
  17189.     clr.l    (a2)+                *dummy
  17190.     move.b    (a1)+,d0            *Rx_ctrl CH
  17191.     subq.b    #1,d0
  17192.     cmpi.b    #$0f,d0
  17193.     bls    @f
  17194.     moveq.l    #$10,d0                *規定外値はすべてOFFとみなす
  17195. @@:
  17196.     bsr    stu2_dt
  17197.     clr.b    (a2)+                *dummy
  17198.     clr.b    (a2)+                *dummy
  17199.     moveq.l    #4-1,d2
  17200. @@:
  17201.     move.b    (a1)+,d0
  17202.     add.b    d0,d3        *add into sum
  17203.     move.b    d0,(a2)+    *patch change,timbre change,rythm change,Rx.R.inst Assign
  17204.     dbra    d2,@b
  17205.     bra    calcset_exsm
  17206.  
  17207. u220stup_limit:    dc.b    0,1,0,1,0,127,0,5,0,5,0,5,0,5,-1
  17208.     .even
  17209.  
  17210. stu2_dtw:            *set data その2
  17211.     * < a2.l=buffer address
  17212.     * < d0.w=data
  17213.     bsr    stu2_dt
  17214.     lsr.w    #8,d0
  17215. stu2_dt:                    *U220送信パケット生成サブルーチン
  17216.     * < a2.l=buffer address
  17217.     * < d0.b=data
  17218.     * < d3.b=sum
  17219.     move.b    d0,-(sp)
  17220.     andi.b    #$0f,d0
  17221.     move.b    d0,(a2)+
  17222.     add.b    d0,d3                *sum
  17223.     move.b    (sp)+,d0
  17224.     lsr.b    #4,d0
  17225.     move.b    d0,(a2)+
  17226.     add.b    d0,d3                *sum
  17227.     rts
  17228.  
  17229. mml_u220_part_setup:                *[U220_PART_SETUP]
  17230.     bsr    get_pt_devid_ifn    *>d2=DEV ID,d3.w=part number
  17231.     bsr    u220_id_set
  17232.     moveq.l    #exclusive_zmd,d0
  17233.     bsr    do_wrt_trk_b
  17234.     moveq.l    #MKID_ROLAND,d0
  17235.     bsr    do_wrt_trk_b
  17236.     moveq.l    #15,d1
  17237.     lea    sct_u220ptstup(pc),a1
  17238.     lea    do_wrt_trk_b(pc),a2
  17239.     bsr    wrt_comment        *コメント書き出し
  17240.     bsr    do_u220ptstup        *送信パケット生成 > d1.l=packet length
  17241.     bra    set_rdexml
  17242.  
  17243. u220_part_setup:                *.U220_PART_SETUP
  17244. *    bsr    check_relation_cmn    *コマンド関係チェック
  17245.     moveq.l    #CMN_MIDI_TRANSMISSION,d0
  17246.     bsr    do_wrt_cmn_b
  17247.     bsr    get_pt_devid_ifn    *d1=I/F number,d2=DEV ID,d3.w=part number
  17248.     move.l    d1,d0
  17249.     bsr    do_wrt_cmn_b        *I/F number
  17250.     moveq.l    #15,d1
  17251.     lea    sct_u220ptstup(pc),a1
  17252.     lea    do_wrt_cmn_b(pc),a2
  17253.     bsr    wrt_comment        *コメント書き出し
  17254.     bsr    do_u220ptstup        *送信パケット生成 > d1.l=packet length
  17255.     bra    set_rdexshp
  17256.  
  17257. do_u220ptstup:                *U220パートセットアップパラメータ取得&MIDIメッセージ作成
  17258.     * < d2=DEV ID
  17259.     * < d3=timbre number(0-5)
  17260.     * > temp_buffer
  17261.     * > d1=packet length(1~)
  17262.     * x d0-d3/a1-a2
  17263.     move.l    #$12_00003c,d5        cmd,addr
  17264.     lsl.w    #4,d3            *d3=d3*16
  17265.     add.w    d3,d5
  17266.     move.l    d5,d3
  17267.     andi.b    #$7f,d3
  17268.     add.w    d5,d5
  17269.     andi.w    #$7f00,d5
  17270.     move.b    d3,d5
  17271.     ori.w    #$0600,d5        *d5=exact address
  17272.     move.l    temp_buffer(pc),a2
  17273.     move.w    #$f041,(a2)+
  17274.     move.b    d2,(a2)+        *set dev ID
  17275.     move.b    #$2b,(a2)+        *set model id
  17276.     move.l    d5,(a2)+        *cmd,addr
  17277.     moveq.l    #13,d1
  17278.     lea    u220ptstup_limit(pc),a1
  17279.     bsr    get_arry_params        *{}で囲まれた数値の取得(< d1 n of data/> d1=n of data)
  17280.     subq.l    #1,d1
  17281.     cmpi.l    #12,d1
  17282.     bne    m_illegal_parameter_format    *パラメータはかならず13個
  17283.     swap    d5
  17284.     move.b    d5,d3
  17285.     swap    d5
  17286.     ror.w    #8,d5
  17287.     add.b    d5,d3
  17288.     ror.w    #8,d5
  17289.     add.b    d5,d3            *d3=address sum
  17290.  
  17291.     move.l    arry_stock(pc),a1
  17292.     move.b    (a1),d0        *timbre number
  17293.     subq.b    #1,d0        *1~128→0~127
  17294.     move.b    10(a1),d1    *Rx.volume
  17295.     lsl.b    #7,d1
  17296.     or.b    d1,d0
  17297.     bsr    stu2_dt
  17298.  
  17299.     move.b    1(a1),d0    *v reserve
  17300.     move.b    7(a1),d1    *out assign
  17301.     lsl.b    #5,d1
  17302.     or.b    d1,d0
  17303.     bsr    stu2_dt
  17304.  
  17305.     moveq.l    #0,d0
  17306.     move.b    2(a1),d0    *midi ch
  17307.     subq.b    #1,d0
  17308.     cmpi.b    #$0f,d0
  17309.     bls    @f
  17310.     moveq.l    #$10,d0        *規定外OFFとみなす
  17311. @@:
  17312.     moveq.l    #0,d1
  17313.     move.b    8(a1),d1    *part level
  17314.     lsl.w    #5,d1
  17315.     or.w    d1,d0
  17316.     move.b    9(a1),d1    *part pan
  17317.     swap    d1
  17318.     lsr.l    #4,d1
  17319.     or.w    d1,d0
  17320.     bsr    stu2_dtw    *2bytes書き込み
  17321.  
  17322.     move.b    3(a1),d0    *k.range low
  17323.     move.b    12(a1),d1    *Rx.HOLD
  17324.     lsl.b    #7,d1
  17325.     or.b    d1,d0
  17326.     bsr    stu2_dt
  17327.  
  17328.     move.b    4(a1),d0    *k.range hi
  17329.     move.b    11(a1),d1    *Rx.PAN
  17330.     lsl.b    #7,d1
  17331.     or.b    d1,d0
  17332.     bsr    stu2_dt
  17333.  
  17334.     move.b    5(a1),d0    *velo level
  17335.     bsr    stu2_dt
  17336.     move.b    6(a1),d0    *velo threshold
  17337.     bsr    stu2_dt
  17338.     bra    calcset_exsm
  17339.  
  17340. u220ptstup_limit:
  17341.     dc.b    1,128
  17342.     dc.b    0,30
  17343.     dc.b    1,17
  17344.     rept    2
  17345.     dc.b    0,127
  17346.     endm
  17347.     dc.b    0,1
  17348.     dc.b    0,127
  17349.     dc.b    0,4
  17350.     dc.b    0,127
  17351.     dc.b    0,15
  17352.     dc.b    0,1
  17353.     dc.b    0,1
  17354.     dc.b    0,1
  17355.     dc.b    -1
  17356.     .even
  17357.  
  17358. mml_u220_common:            *[U220_COMMON]
  17359.     moveq.l    #$10,d1            *omitted case value
  17360.     bsr    get_devid_ifn        *>d2=DEV ID
  17361.     bsr    u220_id_set
  17362.     moveq.l    #exclusive_zmd,d0
  17363.     bsr    do_wrt_trk_b
  17364.     moveq.l    #MKID_ROLAND,d0
  17365.     bsr    do_wrt_trk_b
  17366.     moveq.l    #11,d1
  17367.     lea    sct_u220cmn(pc),a1
  17368.     lea    do_wrt_trk_b(pc),a2
  17369.     bsr    wrt_comment        *コメント書き出し
  17370.     bsr    do_u220cmn        *送信パケット生成 > d1.l=packet length
  17371.     bra    set_rdexml
  17372.  
  17373. u220_common:                *.U220_COMMON
  17374. *    bsr    check_relation_cmn    *コマンド関係チェック
  17375.     moveq.l    #CMN_MIDI_TRANSMISSION,d0
  17376.     bsr    do_wrt_cmn_b
  17377.     moveq.l    #$10,d1            *omitted case value
  17378.     bsr    get_devid_ifn        *d1=I/F number,d2=DEV ID
  17379.     move.l    d1,d0
  17380.     bsr    do_wrt_cmn_b        *I/F number
  17381.     moveq.l    #11,d1
  17382.     lea    sct_u220cmn(pc),a1
  17383.     lea    do_wrt_cmn_b(pc),a2
  17384.     bsr    wrt_comment        *コメント書き出し
  17385.     bsr    do_u220cmn        *送信パケット生成 > d1.l=packet length
  17386.     bra    set_rdexshp
  17387.  
  17388. do_u220cmn:                *U220コモンパラメータ取得&MIDIメッセージ作成
  17389.     * < d2=DEV ID
  17390.     * > temp_buffer
  17391.     * > d1=packet length(1~)
  17392.     * x d0-d3/a1-a2
  17393.     move.l    temp_buffer(pc),a2
  17394.     move.w    #$f041,(a2)+
  17395.     move.b    d2,(a2)+        *set dev ID
  17396.     move.b    #$2b,(a2)+        *set model id
  17397.     move.l    #$12_000618,d0
  17398.     move.l    d0,(a2)+        *cmd,addr
  17399.     moveq.l    #18,d1
  17400.     lea    u220cmn_limit(pc),a1
  17401.     bsr    get_arry_params        *{}で囲まれた数値の取得(< d1 n of data/> d1=n of data)
  17402.     subq.l    #1,d1
  17403.     cmpi.l    #17,d1
  17404.     bne    m_illegal_parameter_format    *パラメータは必ず7個
  17405.     move.l    arry_stock(pc),a1
  17406.     moveq.l    #$06+$18,d3        *address sum=0,data sum=$06+$18
  17407.     moveq.l    #0,d0
  17408.     move.b    4(a1),d0    *cho rate
  17409.     moveq.l    #0,d1
  17410.     move.b    2(a1),d1    *cho level
  17411.     lsl.w    #6,d1
  17412.     or.w    d1,d0
  17413.     move.b    5(a1),d1    *cho depth
  17414.     swap    d1        *lsl.l    #16,d1
  17415.     lsr.l    #5,d1
  17416.     or.w    d1,d0
  17417.     bsr    stu2_dtw
  17418.  
  17419.     moveq.l    #0,d0
  17420.     move.b    8(a1),d0    *rev time
  17421.     moveq.l    #0,d1
  17422.     move.b    6(a1),d1    *cho FB
  17423.     lsl.w    #7,d1
  17424.     or.w    d1,d0
  17425.     move.b    (a1),d1        *cho type
  17426.     swap    d1
  17427.     lsr.l    #3,d1
  17428.     or.w    d1,d0
  17429.     bsr    stu2_dtw
  17430.  
  17431.     moveq.l    #0,d0
  17432.     move.b    3(a1),d0    *cho delay time
  17433.     moveq.l    #0,d1
  17434.     move.b    10(a1),d1    *rev FB
  17435.     swap    d1
  17436.     lsr.l    #5,d1
  17437.     or.w    d1,d0
  17438.     bsr    stu2_dtw
  17439.  
  17440.     moveq.l    #0,d0
  17441.     move.b    9(a1),d0    *rev level
  17442.     moveq.l    #0,d1
  17443.     move.b    11(a1),d1    *pre rev dly time
  17444.     lsl.w    #6,d1
  17445.     or.w    d1,d0
  17446.     move.b    7(a1),d1    *rev type
  17447.     swap    d1
  17448.     lsr.l    #4,d1
  17449.     or.w    d1,d0
  17450.     add.w    d0,d0        *lsl.w    #1,d0
  17451.     move.b    1(a1),d1    *out mode
  17452.     lsr.b    #1,d1
  17453.     roxr.w    #1,d0
  17454.     bsr    stu2_dtw
  17455.  
  17456.     lea    12(a1),a1
  17457.     moveq.l    #3-1,d2
  17458. @@:
  17459.     move.b    (a1)+,d0    *ctrl #1-3
  17460.     ror.w    #8,d0
  17461.     move.b    (a1)+,d0    *parameter #1-3
  17462.     ror.w    #8,d0
  17463.     bsr    stu2_dtw
  17464.     dbra    d2,@b
  17465.     bra    calcset_exsm
  17466.  
  17467. u220cmn_limit:
  17468.     dc.b    0,4
  17469.     dc.b    0,1
  17470.     rept    4
  17471.     dc.b    0,31
  17472.     endm
  17473.     dc.b    1,63
  17474.     dc.b    0,7
  17475.     rept    4
  17476.     dc.b    0,31
  17477.     endm
  17478.     rept    3
  17479.     dc.b    0,63
  17480.     dc.b    0,18
  17481.     endm
  17482.     .even
  17483.  
  17484. mml_u220_timbre:            *[U220_TIMBRE]
  17485.     bsr    get_tmb_devid_ifn    *>d2=DEV ID,d3.w=timbre number
  17486.     bsr    u220_id_set
  17487.     moveq.l    #exclusive_zmd,d0
  17488.     bsr    do_wrt_trk_b
  17489.     moveq.l    #MKID_ROLAND,d0
  17490.     bsr    do_wrt_trk_b
  17491.     moveq.l    #11,d1
  17492.     lea    sct_u220tmb(pc),a1
  17493.     lea    do_wrt_trk_b(pc),a2
  17494.     bsr    wrt_comment        *コメント書き出し
  17495.     bsr    do_u220tmb        *送信パケット生成 > d1.l=packet length
  17496.     bra    set_rdexml
  17497.  
  17498. u220_timbre:                *.U220_TIMBRE
  17499. *    bsr    check_relation_cmn    *コマンド関係チェック
  17500.     moveq.l    #CMN_MIDI_TRANSMISSION,d0
  17501.     bsr    do_wrt_cmn_b
  17502.     bsr    get_tmb_devid_ifn    *d1=I/F number,d2=DEV ID,d3.w=timbre number
  17503.     move.l    d1,d0
  17504.     bsr    do_wrt_cmn_b        *I/F number
  17505.     moveq.l    #11,d1
  17506.     lea    sct_u220tmb(pc),a1
  17507.     lea    do_wrt_cmn_b(pc),a2
  17508.     bsr    wrt_comment        *コメント書き出し
  17509.     bsr    do_u220tmb        *送信パケット生成 > d1.l=packet length
  17510.     bra    set_rdexshp
  17511.  
  17512. do_u220tmb:                *U220ティンバーパラメータ取得&MIDIメッセージ作成
  17513.     * < d2=DEV ID
  17514.     * < d3=timbre number(0-127)
  17515.     * > temp_buffer
  17516.     * > d1=packet length(1~)
  17517.     * x d0-d3/a1-a2
  17518.     move.l    #0,d5
  17519.     lsl.w    #6,d3
  17520.     move.w    d3,d5
  17521.     andi.b    #$7f,d3
  17522.     add.l    d5,d5
  17523.     move.b    d3,d5
  17524.     add.l    #$12_020000,d5        *cmd,addr
  17525.     move.l    temp_buffer(pc),a2
  17526.     move.w    #$f041,(a2)+
  17527.     move.b    d2,(a2)+        *set dev ID
  17528.     move.b    #$2b,(a2)+        *set model id
  17529.     move.l    d5,(a2)+        *cmd,addr
  17530.     swap    d5
  17531.     move.b    d5,d3
  17532.     swap    d5
  17533.     ror.w    #8,d5
  17534.     add.b    d5,d3
  17535.     ror.w    #8,d5
  17536.     add.b    d5,d3            *d3=address sum
  17537.     moveq.l    #12,d1            *12文字分ほしい(足りない分は' 'で埋めてもらえる)
  17538.     bsr    get_string_param2
  17539.     moveq.l    #12-1,d1
  17540.     move.l    arry_stock(pc),a1
  17541. @@:
  17542.     move.b    (a1)+,d0
  17543.     add.b    d0,d3
  17544.     move.b    d0,(a2)+        *文字パラメータ
  17545.     dbra    d1,@b
  17546.     moveq.l    #26,d1
  17547.     lea    u220tmb_limit(pc),a1
  17548.     bsr    get_arry_params        *{}で囲まれた数値の取得(< d1 n of data/> d1=n of data)
  17549.     subq.l    #1,d1
  17550.     cmpi.l    #25,d1
  17551.     bne    m_illegal_parameter_format    *パラメータは最低1個
  17552.     move.l    arry_stock(pc),a1
  17553.                     *音色パラメータ本体
  17554.     moveq.l    #0,d0
  17555.     move.b    1(a1),d0        *tone #
  17556.     subq.b    #1,d0
  17557.     moveq.l    #0,d1
  17558.     move.b    (a1),d1            *tone Meida
  17559.     lsl.w    #7,d1
  17560.     or.w    d1,d0
  17561.     move.b    17(a1),d1        *detune depth
  17562.     swap    d1
  17563.     lsr.l    #4,d1
  17564.     or.w    d1,d0
  17565.     bsr    stu2_dtw
  17566.  
  17567.     move.b    3(a1),d0        *level velo sens
  17568.     move.b    4(a1),d1        *level ch aft
  17569.     lsl.b    #4,d1
  17570.     or.b    d1,d0
  17571.     bsr    stu2_dt
  17572.     move.b    2(a1),d0        *timbre level
  17573.     bsr    stu2_dt
  17574.  
  17575.     move.b    5(a1),d0        *Env A
  17576.     move.b    6(a1),d1        *Env D
  17577.     lsl.b    #4,d1
  17578.     or.b    d1,d0
  17579.     bsr    stu2_dt
  17580.     move.b    7(a1),d0        *Env S
  17581.     move.b    8(a1),d1        *Env R
  17582.     lsl.b    #4,d1
  17583.     or.b    d1,d0
  17584.     bsr    stu2_dt
  17585.  
  17586.     move.b    10(a1),d0        *Pitch fine
  17587.     bsr    stu2_dt
  17588.     move.b    09(a1),d0        *Pitch coarse
  17589.     bsr    stu2_dt
  17590.  
  17591.     moveq.l    #0,d0
  17592.     move.b    11(a1),d0        *Bend lower
  17593.     moveq.l    #0,d1
  17594.     move.b    12(a1),d1        *Bend upper
  17595.     lsl.w    #5,d1
  17596.     or.w    d1,d0
  17597.     move.b    15(a1),d1        *Auto Bend depth
  17598.     swap    d1
  17599.     lsr.l    #7,d1
  17600.     or.w    d1,d0
  17601.     bsr    stu2_dtw
  17602.  
  17603.     moveq.l    #0,d0
  17604.     move.b    14(a1),d0        *Pitch poly aft
  17605.     moveq.l    #0,d1
  17606.     move.b    13(a1),d1        *Pitch ch aft
  17607.     lsl.w    #5,d1
  17608.     or.w    d1,d0
  17609.     move.b    16(a1),d1        *Auto Bend rate
  17610.     swap    d1
  17611.     lsr.l    #6,d1
  17612.     or.w    d1,d0
  17613.     bsr    stu2_dtw
  17614.  
  17615.     move.b    23(a1),d0        *Mod depth
  17616.     lsl.b    #4,d0
  17617.     bsr    stu2_dt
  17618.     move.b    21(a1),d0        *Vib delay
  17619.     move.b    20(a1),d1        *Vib depth
  17620.     lsl.b    #4,d1
  17621.     or.b    d1,d0
  17622.     bsr    stu2_dt
  17623.  
  17624.     move.b    18(a1),d0        *Vib rate
  17625.     bsr    stu2_dt
  17626.     move.b    19(a1),d0        *Vib WF
  17627.     bsr    stu2_dt
  17628.  
  17629.     move.b    22(a1),d0        *Vib rise
  17630.     bsr    stu2_dt
  17631.     move.b    24(a1),d0        *Vib ch aft
  17632.     move.b    25(a1),d1        *Vib poly aft
  17633.     lsl.b    #4,d1
  17634.     or.b    d1,d0
  17635.     bsr    stu2_dt
  17636.     moveq.l    #0,d0            *Dummy
  17637.     bsr    stu2_dtw
  17638.     bra    calcset_exsm
  17639.  
  17640. u220tmb_limit:
  17641.     dc.b    0,31
  17642.     dc.b    1,128
  17643.     dc.b    0,127
  17644.     rept    6
  17645.     dc.b    1,15
  17646.     endm
  17647.     dc.b    8,56
  17648.     dc.b    14,114
  17649.     dc.b    0,15
  17650.     dc.b    0,12
  17651.     dc.b    0,27
  17652.     dc.b    0,27
  17653.     dc.b    0,27
  17654.     dc.b    0,15
  17655.     dc.b    0,15
  17656.     dc.b    0,63
  17657.     dc.b    0,8
  17658.     rept    6
  17659.     dc.b    0,15
  17660.     endm
  17661.     dc.b    -1
  17662.     .even
  17663.  
  17664. mml_u220_drum_setup:                *[U220_SETUP]
  17665.     moveq.l    #$10,d1            *omitted case value
  17666.     bsr    get_devid_ifn        *>d2=DEV ID
  17667.     bsr    u220_id_set
  17668.     moveq.l    #exclusive_zmd,d0
  17669.     bsr    do_wrt_trk_b
  17670.     moveq.l    #MKID_ROLAND,d0
  17671.     bsr    do_wrt_trk_b
  17672.     moveq.l    #15,d1
  17673.     lea    sct_u220drmstup(pc),a1
  17674.     lea    do_wrt_trk_b(pc),a2
  17675.     bsr    wrt_comment        *コメント書き出し
  17676.     bsr    do_u220drmstup        *送信パケット生成 > d1.l=packet length
  17677.     bra    set_rdexml
  17678.  
  17679. u220_drum_setup:                *.U220_SETUP
  17680. *    bsr    check_relation_cmn    *コマンド関係チェック
  17681.     moveq.l    #CMN_MIDI_TRANSMISSION,d0
  17682.     bsr    do_wrt_cmn_b
  17683.     moveq.l    #$10,d1            *omitted case value
  17684.     bsr    get_devid_ifn        *d1=I/F number,d2=DEV ID
  17685.     move.l    d1,d0
  17686.     bsr    do_wrt_cmn_b        *I/F number
  17687.     moveq.l    #15,d1
  17688.     lea    sct_u220drmstup(pc),a1
  17689.     lea    do_wrt_cmn_b(pc),a2
  17690.     bsr    wrt_comment        *コメント書き出し
  17691.     bsr    do_u220drmstup        *送信パケット生成 > d1.l=packet length
  17692.     bra    set_rdexshp
  17693.  
  17694. do_u220drmstup:            *U220ドラムセットアップパラメータ取得&MIDIメッセージ作成
  17695.     * < d2=DEV ID
  17696.     * > temp_buffer
  17697.     * > d1=packet length(1~)
  17698.     * x d0-d3/a1-a2
  17699.     move.l    temp_buffer(pc),a2
  17700.     move.w    #$f041,(a2)+
  17701.     move.b    d2,(a2)+        *set dev ID
  17702.     move.b    #$2b,(a2)+        *set model id
  17703.     move.l    #$12_000634,d0
  17704.     move.l    d0,(a2)+        *cmd,addr
  17705.     moveq.l    #7,d1
  17706.     lea    u220drmstup_limit(pc),a1
  17707.     bsr    get_arry_params        *{}で囲まれた数値の取得(< d1 n of data/> d1=n of data)
  17708.     subq.l    #1,d1
  17709.     cmpi.l    #6,d1
  17710.     bne    m_illegal_parameter_format    *パラメータは必ず7個
  17711.     moveq.l    #$06+$34,d3            *address sum
  17712.     move.l    arry_stock(pc),a1
  17713.     move.b    1(a1),d0        *rythm v rsv
  17714.     move.b    (a1),d1            *rythm set number
  17715.     lsl.b    #5,d1
  17716.     or.b    d1,d0
  17717.     bsr    stu2_dt
  17718.  
  17719.     move.b    2(a1),d0        *rythm part ch
  17720.     subq.b    #1,d0
  17721.     cmpi.b    #$0f,d0
  17722.     bls    @f
  17723.     moveq.l    #$10,d0            *規定外の時はOFFとみなす
  17724. @@:
  17725.     move.b    6(a1),d1        *rythm part Rx.HOLD
  17726.     lsl.b    #5,d1
  17727.     or.b    d1,d0
  17728.     move.b    5(a1),d1        *rythm part Rx.VOLUME
  17729.     lsl.b    #6,d1
  17730.     or.b    d1,d0
  17731.     bsr    stu2_dt
  17732.  
  17733.     move.b    3(a1),d0        *rythm part level
  17734.     move.b    4(a1),d1        *rythm part boost sw
  17735.     lsl.b    #7,d1
  17736.     or.b    d1,d0
  17737.     bsr    stu2_dt
  17738.     clr.w    (a2)+            *dummy
  17739.     bra    calcset_exsm
  17740.  
  17741. u220drmstup_limit:    dc.b    0,3,0,30,0,127,0,127,0,1,0,1,0,1,-1
  17742.     .even
  17743.  
  17744. mml_u220_drum_inst:            *[U220_DRUM_INST]
  17745.     bsr    get_nt_devid_ifn    *>d2=DEV ID,d3.w=note number
  17746.     bsr    u220_id_set
  17747.     moveq.l    #exclusive_zmd,d0
  17748.     bsr    do_wrt_trk_b
  17749.     moveq.l    #MKID_ROLAND,d0
  17750.     bsr    do_wrt_trk_b
  17751.     moveq.l    #14,d1
  17752.     lea    sct_u220drminst(pc),a1
  17753.     lea    do_wrt_trk_b(pc),a2
  17754.     bsr    wrt_comment        *コメント書き出し
  17755.     bsr    do_u220drminst        *送信パケット生成 > d1.l=packet length
  17756.     bra    set_rdexml
  17757.  
  17758. u220_drum_inst:                *.U220_DRUM_INST
  17759. *    bsr    check_relation_cmn    *コマンド関係チェック
  17760.     moveq.l    #CMN_MIDI_TRANSMISSION,d0
  17761.     bsr    do_wrt_cmn_b
  17762.     bsr    get_nt_devid_ifn    *d1=I/F number,d2=DEV ID,d3.w=note
  17763.     move.l    d1,d0
  17764.     bsr    do_wrt_cmn_b        *I/F number
  17765.     moveq.l    #14,d1
  17766.     lea    sct_u220drminst(pc),a1
  17767.     lea    do_wrt_cmn_b(pc),a2
  17768.     bsr    wrt_comment        *コメント書き出し
  17769.     bsr    do_u220drminst        *送信パケット生成 > d1.l=packet length
  17770.     bra    set_rdexshp
  17771.  
  17772. do_u220drminst:                *U220リズムインストパラメータ取得&MIDIメッセージ作成
  17773.     * < d2=DEV ID
  17774.     * < d3=note number(0-127)
  17775.     * > temp_buffer
  17776.     * > d1=packet length(1~)
  17777.     * x d0-d3/a1-a2
  17778.     move.l    #$12_110000,d5
  17779.     lsl.w    #8,d3
  17780.     add.w    d3,d5
  17781.     move.l    temp_buffer(pc),a2
  17782.     move.w    #$f041,(a2)+
  17783.     move.b    d2,(a2)+        *set dev ID
  17784.     move.b    #$2b,(a2)+        *set model id
  17785.     move.l    d5,(a2)+        *cmd,addr
  17786.     moveq.l    #20,d1
  17787.     lea    u220drminst_limit(pc),a1
  17788.     bsr    get_arry_params        *{}で囲まれた数値の取得(< d1 n of data/> d1=n of data)
  17789.     subq.l    #1,d1
  17790.     cmpi.l    #19,d1
  17791.     bne    m_illegal_parameter_format    *パラメータは必ず20個
  17792.     swap    d5
  17793.     move.b    d5,d3
  17794.     swap    d5
  17795.     ror.w    #8,d5
  17796.     add.b    d5,d3
  17797.     ror.w    #8,d5
  17798.     add.b    d5,d3            *d3=address sum
  17799.     move.l    arry_stock(pc),a1
  17800.     subq.b    #1,1(a1)        *1-128→0-127
  17801. @@:
  17802.     move.b    (a1)+,d0
  17803.     add.b    d0,d3
  17804.     move.b    d0,(a2)+
  17805.     dbra    d1,@b
  17806.     bra    calcset_exsm
  17807.  
  17808. u220drminst_limit:
  17809.     dc.b    0,31
  17810.     dc.b    1,128
  17811.     dc.b    0,127
  17812.     dc.b    34,98
  17813.     dc.b    0,31
  17814.     dc.b    0,15
  17815.     dc.b    0,1
  17816.     dc.b    1,15
  17817.     dc.b    1,15
  17818.     dc.b    1,15
  17819.     dc.b    0,27
  17820.     dc.b    14,114
  17821.     dc.b    0,27
  17822.     dc.b    0,27
  17823.     dc.b    0,15
  17824.     dc.b    0,27
  17825.     dc.b    0,15
  17826.     dc.b    0,15
  17827.     dc.b    0,3
  17828.     dc.b    0,15
  17829.     dc.b    -1
  17830.     .even
  17831.  
  17832. mml_u220_print:                *[U220_PRINT]
  17833.     moveq.l    #$10,d1            *omitted case value
  17834.     bsr    get_devid_ifn        *>d2=DEV ID
  17835.     bsr    u220_id_set
  17836.     moveq.l    #exclusive_zmd,d0
  17837.     bsr    do_wrt_trk_b
  17838.     moveq.l    #MKID_ROLAND,d0
  17839.     bsr    do_wrt_trk_b
  17840.     moveq.l    #10,d1
  17841.     lea    sct_u220prt(pc),a1
  17842.     lea    do_wrt_trk_b(pc),a2
  17843.     bsr    wrt_comment        *コメント書き出し
  17844.     bsr    do_u220prt        *送信パケット生成 > d1.l=packet length
  17845.     bra    set_rdexml
  17846.  
  17847. u220_print:                *.U220_PRINT
  17848. *    bsr    check_relation_cmn    *コマンド関係チェック
  17849.     moveq.l    #CMN_MIDI_TRANSMISSION,d0
  17850.     bsr    do_wrt_cmn_b
  17851.     moveq.l    #$10,d1            *omitted case value
  17852.     bsr    get_devid_ifn        *d1=I/F number,d2=DEV ID
  17853.     move.l    d1,d0
  17854.     bsr    do_wrt_cmn_b        *I/F number
  17855.     moveq.l    #10,d1
  17856.     lea    sct_u220prt(pc),a1
  17857.     lea    do_wrt_cmn_b(pc),a2
  17858.     bsr    wrt_comment        *コメント書き出し
  17859.     bsr    do_u220prt        *送信パケット生成 > d1.l=packet length
  17860.     bra    set_rdexshp
  17861.  
  17862. do_u220prt:                *U220文字出力パラメータ取得&MIDIメッセージ作成
  17863.     * < d2=DEV ID
  17864.     * > temp_buffer
  17865.     * > d1=packet length(1~)
  17866.     * x d0-d3/a1-a2
  17867.     move.l    temp_buffer(pc),a2
  17868.     move.w    #$f041,(a2)+
  17869.     move.b    d2,(a2)+        *set dev ID
  17870.     move.b    #$2b,(a2)+        *set model id
  17871.     move.l    #$12_000600,(a2)+    *cmd,addr
  17872.     moveq.l    #12,d1            *最大文字列長
  17873.     bsr    get_string_param    *""で囲まれた文字列の取得(< d1 n of data/> d1=n of data)
  17874.     subq.l    #1,d1
  17875.     bcs    m_parameter_cannot_be_omitted    *パラメータは最低1個
  17876.     moveq.l    #$06,d3            *address sum
  17877.     move.l    arry_stock(pc),a1
  17878.     moveq.l    #12-1,d1        *12文字に足りない分は' 'で埋めてもらっている
  17879. @@:
  17880.     move.b    (a1)+,d0
  17881.     bsr    stu2_dt
  17882.     dbra    d1,@b
  17883.     bra    calcset_exsm
  17884.  
  17885. mml_m1_setup:                *[M1_SETUP]
  17886. do_m1stup:
  17887.     * < d2=DEV ID
  17888.     * > temp_buffer
  17889.     * > d1=packet length(1~)
  17890.     * x d0-d3/a1-a2
  17891.     moveq.l    #8,d1
  17892.     suba.l    a1,a1
  17893.     bsr    get_arry_params        *{}で囲まれた数値の取得(< d1 n of data/> d1=n of data)
  17894.     cmpi.l    #8,d1
  17895.     bne    m_illegal_parameter_format    *パラメータは必ず8個
  17896.     move.l    arry_stock(pc),a1
  17897.     move.l    temp_buffer(pc),a2
  17898.     addq.w    #8,a2
  17899.     lea    8(a2),a3
  17900.     moveq.l    #8-1,d2        *dbra count
  17901. m1_md_lp:
  17902.     moveq.l    #03,d1        *ON
  17903.     move.b    (a1)+,d0
  17904.     subq.b    #1,d0
  17905.     cmpi.b    #$0f,d0
  17906.     bls    @f
  17907.     moveq.l    #0,d0        *一応チャンネル1にする
  17908.     moveq.l    #0,d1        *OFF
  17909. @@:
  17910.     move.b    d0,(a2)+
  17911.     move.b    d1,(a3)+
  17912.     dbra    d2,m1_md_lp
  17913.     rts
  17914.  
  17915. m1_setup:                *.M1_SETUP
  17916. *    bsr    check_relation_cmn    *コマンド関係チェック
  17917.     bsr    do_m1stup        *送信パケット生成 > d1.l=packet length
  17918.     jmp    cmpl_lp
  17919.  
  17920. mml_m1_part_setup:            *[M1_PART_SETUP]
  17921. do_m1ptstup:
  17922.     moveq.l    #40,d1
  17923.     lea    m1ptstup_limit(pc),a1
  17924.     bsr    get_arry_params_w    *{}で囲まれた数値の取得(< d1 n of data/> d1=n of data)
  17925.     cmpi.l    #40,d1
  17926.     bne    m_illegal_parameter_format    *パラメータは必ず40個
  17927.     move.l    arry_stock(pc),a1
  17928.     move.l    temp_buffer(pc),a2
  17929.     lea    56(a2),a2
  17930.     moveq.l    #40-1,d2
  17931. @@:
  17932.     move.w    (a1)+,d0
  17933.     move.b    d0,(a2)+
  17934.     dbra    d2,@b
  17935.     rts
  17936.  
  17937. m1_part_setup:                *.M1_PART_SETUP
  17938. *    bsr    check_relation_cmn    *コマンド関係チェック
  17939.     bsr    do_m1ptstup        *送信パケット生成 > d1.l=packet length
  17940.     jmp    cmpl_lp
  17941.  
  17942. m1ptstup_limit:
  17943.     rept    8
  17944.     dc.l    0,199,0,99,-12,12,-50,50,0,13
  17945.     endm
  17946.     dc.l    -32768
  17947.     .even
  17948.  
  17949. mml_m1_effect_setup:            *[M1_EFFECT_SETUP]
  17950. do_m1efctstup:
  17951.     moveq.l    #25,d1
  17952.     lea    m1efctstup_limit(pc),a1
  17953.     bsr    get_arry_params_w    *{}で囲まれた数値の取得(< d1 n of data/> d1=n of data)
  17954.     cmpi.l    #25,d1
  17955.     bne    m_illegal_parameter_format    *パラメータは必ず40個
  17956.     move.l    arry_stock(pc),a1
  17957.     lea    m1_ef_dflt(pc),a2
  17958.     moveq.l    #25-1,d2        *=dbra counter
  17959. @@:
  17960.     move.w    (a1)+,d0
  17961.     move.b    d0,(a2)+
  17962.     dbra    d2,@b
  17963.     rts
  17964.  
  17965. m1_effect_setup:            *.M1_EFFECT_SETUP
  17966. *    bsr    check_relation_cmn    *コマンド関係チェック
  17967.     bsr    do_m1efctstup        *送信パケット生成 > d1.l=packet length
  17968.     jmp    cmpl_lp
  17969.  
  17970. m1efctstup_limit:
  17971.     dc.l    0,33
  17972.     dc.l    0,33
  17973.     dc.l    0,100
  17974.     dc.l    0,100
  17975.     dc.l    0,100
  17976.     dc.l    0,100
  17977.     dc.l    0,101
  17978.     dc.l    0,101
  17979.     dc.l    0,%11111
  17980.     rept    16
  17981.     dc.l    -32767,32767
  17982.     endm
  17983.     dc.l    -32768
  17984.     .even
  17985.  
  17986. mml_m1_print:                *[M1_PRINT]
  17987. do_m1prt:                *M1文字出力パラメータ取得&MIDIメッセージ作成
  17988.     moveq.l    #10,d1            *最大文字列長
  17989.     bsr    get_string_param    *""で囲まれた文字列の取得(< d1 n of data/> d1=n of data)
  17990.     subq.l    #1,d1
  17991.     bcs    m_parameter_cannot_be_omitted    *パラメータは最低1個
  17992.     move.l    arry_stock(pc),a1
  17993.     move.l    temp_buffer(pc),a2
  17994.     lea    20(a2),a2
  17995.     moveq.l    #10-1,d1
  17996. @@:
  17997.     move.b    (a1)+,(a2)+
  17998.     dbra    d1,@b
  17999.     rts
  18000.  
  18001. m1_print:                *.M1_PRINT
  18002. *    bsr    check_relation_cmn    *コマンド関係チェック
  18003.     bsr    do_m1prt        *送信パケット生成 > d1.l=packet length
  18004.     jmp    cmpl_lp
  18005.  
  18006. mml_send_to_m1:                *[SEND_TO_M1]
  18007.     moveq.l    #midi_transmission_zmd,d0
  18008.     bsr    do_wrt_trk_b
  18009.     moveq.l    #25,d1
  18010.     lea    sct_sndm1(pc),a1
  18011.     lea    do_wrt_trk_b(pc),a2
  18012.     bsr    wrt_comment
  18013.     moveq.l    #$30,d1            *omitted case value
  18014.     bsr    get_devid_ifn        *d1=I/F number(dummy),d2=DEV ID
  18015.     bsr    do_send_m1        *送信パケット生成 > d1.l=packet length
  18016.     moveq.l    #$77,d0
  18017.     bsr    do_wrt_trk_l        *データ長
  18018.     move.l    temp_buffer(pc),a1
  18019.     moveq.l    #$77-1,d1
  18020. @@:
  18021.     move.b    (a1)+,d0
  18022.     bsr    do_wrt_trk_b
  18023.     dbra    d1,@b
  18024.  
  18025.     moveq.l    #midi_transmission_zmd,d0    *SEQ0に設定する
  18026.     bsr    do_wrt_trk_b
  18027.     moveq.l    #13,d1
  18028.     lea    sct_m1seq0(pc),a1
  18029.     lea    do_wrt_trk_b(pc),a2
  18030.     bsr    wrt_comment
  18031.     moveq.l    #8,d0
  18032.     bsr    do_wrt_trk_l        *データ長
  18033.     move.l    arry_stock(pc),a1
  18034.     moveq.l    #8-1,d1
  18035. @@:
  18036.     move.b    (a1)+,d0
  18037.     bsr    do_wrt_trk_b
  18038.     dbra    d1,@b
  18039.     rts
  18040.  
  18041. send_to_m1:                *.SEND_TO_M1
  18042. *    bsr    check_relation_cmn    *コマンド関係チェック
  18043.     moveq.l    #CMN_MIDI_TRANSMISSION,d0
  18044.     bsr    do_wrt_cmn_b
  18045.     moveq.l    #$30,d1            *omitted case value
  18046.     bsr    get_devid_ifn        *d1=I/F number,d2=DEV ID
  18047.     move.w    d1,-(sp)
  18048.     move.l    d1,d0
  18049.     bsr    do_wrt_cmn_b        *I/F number
  18050.     moveq.l    #25,d1
  18051.     lea    sct_sndm1(pc),a1
  18052.     lea    do_wrt_cmn_b(pc),a2
  18053.     bsr    wrt_comment
  18054.     bsr    do_send_m1        *送信パケット生成 > d1.l=packet length
  18055.     moveq.l    #$77,d0
  18056.     bsr    do_wrt_cmn_l        *データ長
  18057.     moveq.l    #$77-1,d1
  18058. @@:
  18059.     move.b    (a1)+,d0
  18060.     bsr    do_wrt_cmn_b
  18061.     dbra    d1,@b
  18062.  
  18063.     moveq.l    #CMN_MIDI_TRANSMISSION,d0
  18064.     bsr    do_wrt_cmn_b
  18065.     move.w    (sp)+,d0
  18066.     bsr    do_wrt_cmn_b        *I/F number
  18067.     moveq.l    #13,d1
  18068.     lea    sct_m1seq0(pc),a1
  18069.     lea    do_wrt_cmn_b(pc),a2
  18070.     bsr    wrt_comment
  18071.     moveq.l    #8,d0
  18072.     bsr    do_wrt_cmn_l        *データ長
  18073.     move.l    arry_stock(pc),a1
  18074.     moveq.l    #8-1,d1
  18075. @@:
  18076.     move.b    (a1)+,d0
  18077.     bsr    do_wrt_cmn_b
  18078.     dbra    d1,@b
  18079.     jmp    cmpl_lp
  18080.  
  18081. do_send_m1:                *設定した各種パラメータをM1へ送信するための
  18082.     * < d2.b=m1 id number        *パケットの作成
  18083.     * > temp_buffer    parameter packet
  18084.     * > arry_stock  mode change packet(GO INTO SEQ0)
  18085.     * d0-d2,a1,a2
  18086.     move.l    temp_buffer(pc),a1
  18087.     move.b    #$f7,$76(a1)        *EOX
  18088.     move.l    #$f0420019,(a1)        *header&maker ID,dummy,M1
  18089.     move.b    d2,2(a1)        *ID
  18090.  
  18091.     move.l    arry_stock(pc),a2    *SEQ-0にするメッセージ作成
  18092.     move.l    (a1)+,(a2)+        *HEADER
  18093.     move.l    #$4e0600f7,(a2)+    *cmd,mode,bank,EOX
  18094.  
  18095.     move.l    #$48_00_0000,(a1)+    *cmd,bank,seq data size
  18096.     move.b    #$04,16(a1)        *beat
  18097.     move.b    #$78,17(a1)        *tempo/protect
  18098.     move.b    #$14,19(a1)        *next song
  18099.     clr.b    30(a1)            *nul
  18100.     lea    m1_ef_dflt+25(pc),a2
  18101.     moveq.l    #25-1,d0
  18102. @@:
  18103.     move.b    -(a2),31(a1,d0.w)    *エフェクトデータのセット
  18104.     dbra    d0,@b
  18105.  
  18106.     moveq.l    #96-1,d0            *データ列のならび変え
  18107. @@:
  18108.     move.l    d0,d1
  18109.     divu.w    #7,d1
  18110.     add.w    d0,d1
  18111.     move.b    (a1,d0.w),1(a1,d1.w)
  18112.     dbra    d0,@b
  18113.  
  18114.     moveq.l    #0,d2            *MIDIデータへの変換
  18115. stmlp:
  18116.     moveq.l    #7-1,d1
  18117.     moveq.l    #0,d3
  18118. @@:
  18119.     move.b    1(a1,d1.w),d0
  18120.     andi.b    #$7f,1(a1,d1.w)
  18121.     lsl.b    #1,d0
  18122.     roxl.b    #1,d3
  18123.     dbra    d1,@b
  18124.     move.b    d3,(a1)
  18125.     addq.w    #8,a1
  18126.     addq.w    #7,d2
  18127.     cmpi.w    #96,d2
  18128.     bls    stmlp
  18129.     rts
  18130.  
  18131. sct_sndm1:    dc.b    'M1 SEQUENCER CONTROL DATA',0
  18132. sct_m1seq0:    dc.b    'M1 SEQ-0 MODE',0
  18133.     .even
  18134. *-----------------------------------------------------------------------------
  18135. clc_rest:                *休符のケース($80)
  18136.     bsr    get_vlv            *get step
  18137.     mulu    clc_trkfrq(pc),d1
  18138.     add.l    d1,d5            *st measure
  18139.     add.l    d1,d7            *tr total
  18140.     tst.b    clc_phase-work(a6)
  18141.     ble    @f            *minus or zero
  18142.     bsr    calc_play_time
  18143. @@:
  18144.     bsr    get_vlv
  18145.     bra    getzmdlp
  18146.  
  18147. clc_track_delay:            *トラックディレイ($84)
  18148. clc_wait:                *ウェイトのケース($81)
  18149.     bsr    get_vlv            *get step
  18150.     mulu    clc_trkfrq(pc),d1
  18151.     add.l    d1,d5            *st measure
  18152.     add.l    d1,d7            *tr total
  18153.     tst.b    clc_phase-work(a6)
  18154.     ble    @f            *minus or zero
  18155.     bsr    calc_play_time
  18156. @@:
  18157.     bra    getzmdlp
  18158.  
  18159. clc_mx_key:                *MXDRVキーオン($82)
  18160.     move.b    (a4)+,d0        *key
  18161.     add.b    d0,d4
  18162.     bsr    get_vlv            *get step
  18163.     mulu    clc_trkfrq(pc),d1
  18164.     add.l    d1,d5            *st measure
  18165.     add.l    d1,d7            *tr total
  18166.     tst.b    clc_phase-work(a6)
  18167.     ble    getzmdlp        *minus or zero
  18168.     bsr    calc_play_time
  18169.     bra    getzmdlp
  18170.  
  18171. clc_portament:                *ポルタメント($83)
  18172.     move.b    (a4)+,d0        *src note
  18173.     add.b    d0,d4
  18174.     move.b    (a4)+,d3        *dest note
  18175.     add.b    d3,d4
  18176.     tst.b    d0
  18177.     bpl    @f
  18178.     bsr    get_vlv            *delay
  18179. @@:
  18180.     tst.b    d3
  18181.     bpl    @f
  18182.     bsr    get_vlv            *get cnt
  18183. @@:
  18184.     bsr    get_vlv            *step time
  18185.     mulu    clc_trkfrq(pc),d1
  18186.     add.l    d1,d5            *st measure
  18187.     add.l    d1,d7            *tr total
  18188.     tst.b    clc_phase-work(a6)
  18189.     ble    @f            *minus or zero
  18190.     bsr    calc_play_time
  18191. @@:
  18192.     bsr    get_vlv            *gate time
  18193.     add.b    (a4)+,d4        *velocity
  18194.     bra    getzmdlp
  18195.  
  18196. clc_ch_fader:                *チャンネルフェーダー
  18197.     move.b    (a4)+,d0        *type
  18198.     lsl.w    #8,d0
  18199.     move.b    (a4)+,d0
  18200.     add.w    d0,d4
  18201.     move.b    (a4)+,d0        *ch
  18202.     lsl.w    #8,d0
  18203.     move.b    (a4)+,d0
  18204.     add.w    d0,d4
  18205. ccf00:
  18206.     move.b    (a4)+,d0        *omt
  18207.     beq    getzmdlp
  18208.     add.b    d0,d4
  18209.     lsr.b    #1,d0
  18210.     bcc    @f
  18211.     move.b    (a4)+,d3
  18212.     lsl.w    #8,d3
  18213.     move.b    (a4)+,d3
  18214.     add.w    d3,d4
  18215. @@:
  18216.     lsr.b    #1,d0
  18217.     bcc    @f
  18218.     add.b    (a4)+,d4
  18219. @@:
  18220.     lsr.b    #1,d0
  18221.     bcc    getzmdlp
  18222.     add.b    (a4)+,d4
  18223.     bra    getzmdlp
  18224.  
  18225. clc_mstr_fader:                *マスターフェーダー
  18226.     move.b    (a4)+,d0        *type
  18227.     lsl.w    #8,d0
  18228.     move.b    (a4)+,d0
  18229.     add.w    d0,d4
  18230.     bra    ccf00
  18231.  
  18232. clc_bend_@b:                *オートベンド($e0)
  18233. clc_bend_@k:                *オートベンド($e1)
  18234.     move.b    (a4)+,d0        *omt
  18235.     beq    getzmdlp
  18236.     bpl    @f
  18237.     bsr    ope_word        *src detune
  18238. @@:
  18239.     add.b    d0,d4            *omt
  18240.     add.b    d0,d0            *check omt
  18241.     bpl    @f
  18242.     bsr    ope_word        *dest detune
  18243. @@:
  18244.     add.b    d0,d0            *check omt
  18245.     bpl    @f
  18246.     bsr    ope_word        *delay
  18247. @@:
  18248.     add.b    d0,d0            *check omt
  18249.     bpl    getzmdlp
  18250.     bsr    ope_word        *tail
  18251.     bra    getzmdlp
  18252.  
  18253. clc_auto_portament:            *オートポルタメント
  18254.     add.b    (a4)+,d4        *get sw
  18255.     move.b    (a4)+,d0        *get omt
  18256.     add.b    d0,d4
  18257. 1:
  18258.     tst.b    d0            *check omt
  18259.     bpl    @f
  18260.     bsr    ope_word
  18261. @@:                    *skip delay,tail
  18262.     add.b    d0,d0
  18263.     beq    getzmdlp
  18264.     bra    1b
  18265.  
  18266. clc_pmod8:                *PMOD振幅(8point)        ($e2)
  18267. clc_agogik8:                *AGOGIK振幅(8point)        ($f0)
  18268.     add.b    (a4)+,d4        *get switch
  18269.     move.b    (a4)+,d0        *get omt
  18270.     beq    getzmdlp        *case:omt=0
  18271. clcpm8:
  18272.     add.b    d0,d4
  18273. clcpm8lp:
  18274.     lsr.b    #1,d0
  18275.     bcc    @f
  18276.     bsr    ope_word        *get depth
  18277. @@:
  18278.     tst.b    d0
  18279.     bne    clcpm8lp
  18280.     bra    getzmdlp
  18281.  
  18282. clc_arcc_deepen:        *ARCC振幅増加
  18283.     add.b    (a4)+,d4    *arcc no.
  18284. clc_vseq_deepen:        *VSEQ振幅増加
  18285.     move.b    (a4)+,d0    *get omt
  18286.     add.b    d0,d4
  18287.     tst.b    d0
  18288.     bpl    @f
  18289.     bsr    get_vlv        *speed
  18290. @@:
  18291.     add.b    d0,d0
  18292.     bpl    @f
  18293.     add.b    (a4)+,d4    *depth
  18294. @@:
  18295.     add.b    d0,d0
  18296.     bpl    getzmdlp
  18297.     bsr    get_vlv        *repeat time
  18298.     bra    getzmdlp
  18299.  
  18300. clc_pmod_deepen:        *PMOD振幅増加
  18301. clc_agogik_deepen:        *AGOGIK振幅増加
  18302.     move.b    (a4)+,d0    *get omt
  18303.     add.b    d0,d4
  18304.     tst.b    d0
  18305.     bpl    @f
  18306.     bsr    get_vlv        *speed
  18307. @@:
  18308.     add.b    d0,d0
  18309.     bpl    @f
  18310.     bsr    ope_word    *depth
  18311. @@:
  18312.     add.b    d0,d0
  18313.     bpl    getzmdlp
  18314.     bsr    get_vlv        *repeat time
  18315.     bra    getzmdlp
  18316.  
  18317. clc_pmod_speed8:            *PMODスピード(8point)        ($e4)
  18318. clc_vseq_speed8:            *VSEQスピード(8point)        ($ee)
  18319. clc_agogik_speed8:            *AGOGIKスピード(8point)        ($f2)
  18320.     move.b    (a4)+,d0        *get omt
  18321.     beq    getzmdlp        *case:omt=0
  18322.     add.b    d0,d4
  18323. clcps8lp:
  18324.     lsr.b    #1,d0
  18325.     bcc    @f
  18326.     bsr    ope_word        *get depth
  18327. @@:
  18328.     tst.b    d0
  18329.     bne    clcps8lp
  18330.     bra    getzmdlp
  18331.  
  18332. clc_pmod_delay8:            *PMODディレイ(8point)        ($e5)
  18333. clc_aftc_delay8:            *ARCCディレイ(8point)        ($ec)
  18334. clc_vseq_delay8:            *VSEQディレイ(8point)        ($ef)
  18335. clc_agogik_delay8:            *AGOGIKディレイ(8point)        ($f3)
  18336.     move.b    (a4)+,d0        *get omt
  18337.     lsl.w    #8,d0
  18338.     move.b    (a4)+,d0        *get omt
  18339.     add.b    d0,d4
  18340. cpdl8_lp:
  18341.     lsr.w    #1,d0
  18342.     bcc    @f
  18343.     bsr    ope_word        *get depth
  18344. @@:
  18345.     tst.w    d0
  18346.     bne    cpdl8_lp
  18347.     bra    getzmdlp
  18348.  
  18349. clc_aftertouch:                *アフタータッチ・シーケンス    ($e8)
  18350.     add.b    (a4)+,d4        *get switch value
  18351.     move.b    (a4)+,d0        *get omt
  18352.     beq    getzmdlp        *case:omt=0
  18353.     add.b    d0,d4
  18354.     add.b    (a4)+,d4        *get rltvmark
  18355. 1:
  18356.     lsr.b    #1,d0
  18357.     bcc    @f
  18358.     add.b    (a4)+,d4        *get depth
  18359. @@:
  18360.     tst.b    d0
  18361.     bne    1b
  18362.     bra    getzmdlp
  18363.  
  18364. clc_arcc8:                *ARCC振幅(8point)        ($e6)
  18365.     add.b    (a4)+,d4        *get arcc number
  18366. clc_vseq8:                *エンハンスドベロシティ・シーケンス振幅    ($ea)
  18367.     add.b    (a4)+,d4        *get switch value
  18368.     move.b    (a4)+,d0        *get omt
  18369.     beq    getzmdlp        *case:omt=0
  18370.     add.b    d0,d4
  18371. 1:
  18372.     lsr.b    #1,d0
  18373.     bcc    @f
  18374.     add.b    (a4)+,d4        *get depth
  18375. @@:
  18376.     tst.b    d0
  18377.     bne    1b
  18378.     bra    getzmdlp
  18379.  
  18380. clc_vseq_wf:                *VSEQ波形
  18381.     move.b    (a4)+,d0        *get omt
  18382.     beq    getzmdlp
  18383.     add.b    d0,d4
  18384.     lsr.b    #1,d0
  18385.     bcc    @f
  18386.     add.b    (a4)+,d4        *wave number
  18387.     add.b    (a4)+,d4
  18388. @@:
  18389.     lsr.b    #1,d0
  18390.     bcc    @f
  18391.     add.b    (a4)+,d4        *default value
  18392. @@:
  18393.     lsr.b    #1,d0
  18394.     bcc    getzmdlp
  18395.     add.b    (a4)+,d4        *default value
  18396.     bra    getzmdlp
  18397.  
  18398. clc_effect_ctrl:            *エフェクト設定            ($f4)
  18399.     move.b    (a4)+,d0        *get omt
  18400.     beq    getzmdlp        *case:omt=0
  18401.     add.b    d0,d4
  18402. clcvs8lp:
  18403.     lsr.b    #1,d0
  18404.     bcc    @f
  18405.     add.b    (a4)+,d4        *get depth
  18406. @@:
  18407.     tst.b    d0
  18408.     bne    clcvs8lp
  18409.     bra    getzmdlp
  18410.  
  18411. clc_arcc_speed8:            *ARCCスピード(8point)        ($e8)
  18412.     add.b    (a4)+,d4        *get arcc number
  18413.     bra    clc_pmod_speed8
  18414.  
  18415. clc_arcc_delay8:            *ARCCディレイ(8point)        ($e9)
  18416.     add.b    (a4)+,d4        *get arcc number
  18417.     bra    clc_pmod_delay8
  18418.  
  18419. clc_event:                *イベント制御
  18420.     move.b    (a4)+,d0
  18421.     add.b    d0,d4
  18422.     lsl.w    #8,d0
  18423.     move.b    (a4)+,d0
  18424.     add.b    d0,d4
  18425.     swap    d0
  18426.     move.b    (a4)+,d0
  18427.     add.b    d0,d4
  18428.     lsl.w    #8,d0
  18429.     move.b    (a4)+,d0        *get 4bytes offset
  18430.     add.b    d0,d4
  18431.     tst.l    d0
  18432.     bne    exit_clcevnt
  18433.     rept    4
  18434.     add.b    (a4)+,d4        *オブジェクトカテゴリ・クラス等をスキップ
  18435.     endm
  18436. @@:
  18437.     tst.b    (a4)+
  18438.     bne    @b
  18439.     bra    getzmdlp
  18440. exit_clcevnt:
  18441.     add.l    d0,a4
  18442.     bra    getzmdlp
  18443.  
  18444. clc_poke:                *ワークエリア直接書き換え    ($f5)
  18445. clc_rltv_poke:                *ワークエリア直接書き換え    ($f6)
  18446.     moveq.l    #0,d0
  18447.     move.b    (a4)+,d0
  18448.     add.b    d0,d4            *checksum
  18449.     move.l    d0,d1
  18450.     lsr.w    #4,d1            *d1=address count
  18451.     andi.w    #$0f,d0            *d0=data count
  18452. @@:
  18453.     add.b    (a4)+,d4        *checksum
  18454.     dbra    d1,@b
  18455. @@:
  18456.     add.b    (a4)+,d4        *checksum
  18457.     dbra    d0,@b
  18458.     bra    getzmdlp
  18459.  
  18460. clc_timbre_split:            *音色振り分け
  18461.     moveq.l    #0,d0
  18462.     move.b    (a4)+,d0
  18463.     add.w    d0,d4
  18464.     add.b    d0,d0            *最上位殺して*2
  18465.     beq    getzmdlp
  18466. @@:
  18467.     add.b    (a4)+,d4        *start note
  18468.     add.b    (a4)+,d4        *end note
  18469.     add.b    (a4)+,d4        *bank.w
  18470.     add.b    (a4)+,d4
  18471.     add.b    (a4)+,d4        *timbre.w
  18472.     add.b    (a4)+,d4
  18473.     subq.w    #2,d0
  18474.     bne    @b
  18475.     bra    getzmdlp
  18476.  
  18477. clc_tempo_t:                *テンポ
  18478.     move.b    (a4)+,d1
  18479.     lsl.w    #8,d1
  18480.     move.b    (a4)+,d1
  18481.     add.w    d1,d4
  18482.     move.w    d1,clc_tempo-work(a6)
  18483.     tst.b    clc_phase-work(a6)
  18484.     bne    getzmdlp
  18485.     bsr    set_tempo_map        *tempo mapへ登録
  18486.     bra    getzmdlp
  18487.  
  18488. clc_rltv_t:                *相対テンポ
  18489.     move.b    (a4)+,d1
  18490.     lsl.w    #8,d1
  18491.     move.b    (a4)+,d1
  18492.     add.w    d1,d4
  18493.     add.w    d1,clc_tempo-work(a6)
  18494.     beq    clc_rt_mns        *テンポ0はダメ
  18495.     bpl    crt00
  18496.     tst.w    d1
  18497.     bmi    clc_rt_mns
  18498.     move.w    #32767,clc_tempo-work(a6)
  18499.     bra    crt00
  18500. clc_rt_mns:
  18501.     move.w    #1,clc_tempo-work(a6)
  18502. crt00:
  18503.     move.w    clc_tempo(pc),d1
  18504.     tst.b    clc_phase-work(a6)
  18505.     bne    getzmdlp
  18506.     bsr    set_tempo_map        *tempo mapへ登録
  18507.     bra    getzmdlp
  18508.  
  18509. set_tempo_map:                *テンポマップ作成
  18510.     * < d1.l=tempo value
  18511.     move.l    tempo_map_addr(pc),a1
  18512.     move.l    (a1)+,d3
  18513.     lea    8(a1,d3.l),a0        *end addr
  18514. stmplp:
  18515.     cmp.l    (a1),d7
  18516.     bcs    @f            *元もとセットされていた値より小さいなら
  18517.     beq    wrt_tempo_map        *元もとセットされていた値と同じなら
  18518.     addq.w    #8,a1            *元もとセットされていた値より大きいなら
  18519.     cmp.l    a1,a0
  18520.     bne    stmplp
  18521.     addq.l    #8,d3
  18522.     suba.l    tempo_map_addr(pc),a1
  18523.     bsr    enlarge_tempo_map
  18524.     adda.l    tempo_map_addr(pc),a1
  18525.     bra    wrt_tempo_map
  18526. @@:                    *潜り込ませる
  18527.     addq.l    #8,d3
  18528.     move.l    tempo_map_addr(pc),d0
  18529.     suba.l    d0,a0
  18530.     suba.l    d0,a1
  18531.     bsr    enlarge_tempo_map
  18532.     move.l    tempo_map_addr(pc),d0
  18533.     adda.l    d0,a0
  18534.     adda.l    d0,a1
  18535. @@:
  18536.     move.l    -(a0),8(a0)
  18537.     move.l    -(a0),8(a0)
  18538.     cmp.l    a1,a0
  18539.     bne    @b
  18540. wrt_tempo_map:
  18541.     move.l    d7,(a1)+        *累積ステップタイム
  18542.     move.l    d1,(a1)+        *テンポ値
  18543. exit_sttmpmp:
  18544.     move.l    tempo_map_addr(pc),a1
  18545.     move.l    d3,(a1)
  18546.     rts
  18547.  
  18548. enlarge_tempo_map:            *テンポマップ拡張
  18549. reglist    reg    d0-d3/a0-a1
  18550.     movem.l    reglist,-(sp)
  18551.     addq.l    #8,d3            *d3は要素を差しているだけなので
  18552.     move.l    tempo_map_size(pc),d2    *サイズ値に変換して比較
  18553.     cmp.l    d2,d3
  18554.     bls    @f
  18555.     add.l    #1024,d2        *1kByte分追加確保
  18556.     move.l    tempo_map_addr(pc),a1
  18557.     bsr    enlarge_mem
  18558.     tst.l    d0
  18559.     bmi    t_out_of_memory_clc
  18560.     move.l    d2,tempo_map_size-work(a6)
  18561.     move.l    a0,tempo_map_addr-work(a6)
  18562. @@:
  18563.     movem.l    (sp)+,reglist
  18564.     rts
  18565.  
  18566. calc_play_time:                *演奏時間の計算
  18567.     * < d1.l=step time
  18568.     * x d1,d2,d3,a1
  18569.     * - d0
  18570.     move.l    tempo_map_addr(pc),a1
  18571.     move.l    (a1),a0            *a0.l=tempo map now
  18572. cptlp:
  18573.     cmp.l    tempo_map_size(pc),a0    *phase2ではtempo_map_sizeは領域終端アドレス
  18574.     beq    do_cpt
  18575.     cmp.l    8(a0),d7        *次の累積ステップと比較
  18576.     bls    do_cpt
  18577.     move.l    d7,d2
  18578.     sub.l    d1,d2
  18579.     move.l    8(a0),d1
  18580. *    cmp.l    d2,d1
  18581. *    bcs    @f
  18582.     sub.l    d2,d1
  18583.     bsr    do_cpt
  18584. *@@:
  18585.     move.l    d7,d1
  18586.     addq.w    #8,a0
  18587.     sub.l    (a0),d1
  18588.     move.l    a0,(a1)
  18589.     bra    cptlp
  18590.  
  18591. do_cpt:
  18592.     move.l    4(a0),d2        *get tempo(まずは累積ステップ境界をまたいだ分に付いて計算)
  18593.     mulu    clc_mst_clk(pc),d2    *mst_clk*tempo
  18594.     lsl.l    #2,d1            *4
  18595.     swap    d1
  18596.     clr.w    d1            *65536
  18597.     bsr    wari
  18598.     add.l    d1,_clc_play_time-work(a6)
  18599.     rts
  18600.  
  18601. wari:                *32ビット/32ビット=32ビット...32ビット
  18602.     * < d1.l/d2.l=d1.l ...d2.l
  18603.     cmpi.l    #$ffff,d2
  18604.     bls    divx        *16ビット以下の数値なら1命令で処理
  18605.     cmp.l    d1,d2
  18606.     beq    div01        *d1=d2商は1
  18607.     bls    div02        *1命令では無理なケース
  18608.  
  18609.     move.l    d1,d2        *商は0余りはd1.l
  18610.     moveq.l    #0,d1
  18611.     rts
  18612. div01:                *商は1余り0
  18613.     moveq.l    #1,d1
  18614.     moveq.l    #0,d2
  18615.     rts
  18616. div02:
  18617.     movem.l    d3-d5,-(sp)
  18618.     move.l    d2,d3
  18619.     clr.w    d3
  18620.     swap    d3
  18621.     addq.l    #1,d3
  18622.     move.l    d1,d4
  18623.     move.l    d2,d5
  18624.     move.l    d3,d2
  18625.     bsr    divx
  18626.     move.l    d5,d2
  18627.     divu    d3,d2
  18628.     divu    d2,d1
  18629.     andi.l    #$ffff,d1
  18630. div03:
  18631.     move.l    d5,d2
  18632.     move.l    d5,d3
  18633.     swap    d3
  18634.     mulu    d1,d2
  18635.     mulu    d1,d3
  18636.     swap    d3
  18637.     add.l    d3,d2
  18638.     sub.l    d4,d2
  18639.     bhi    div04
  18640.     neg.l    d2
  18641.     cmp.l    d2,d5
  18642.     bhi    div05
  18643.     addq.l    #1,d1
  18644.     bra    div03
  18645. div04:
  18646.     subq.l    #1,d1
  18647.     bra    div03
  18648. div05:
  18649.     movem.l    (sp)+,d3-d5
  18650.     rts
  18651. divx:
  18652.     movem.w    d1/d3,-(sp)
  18653.     clr.w    d1
  18654.     swap    d1
  18655.     divu    d2,d1
  18656.     move.w    d1,d3
  18657.     move.w    (sp)+,d1
  18658.     divu    d2,d1
  18659.     swap    d1
  18660.     moveq.l    #0,d2
  18661.     move.w    d1,d2
  18662.     move.w    d3,d1
  18663.     swap    d1
  18664.     move.w    (sp)+,d3
  18665.     rts
  18666.  
  18667. clc_exclusive:                *エクスクルーシブ転送    ($f3)
  18668.     add.b    (a4)+,d4        *exclusive mode
  18669. clc_midi_transmission:            *MIDIデータ転送        ($f4)
  18670.     moveq.l    #0,d0
  18671.     move.b    (a4)+,d0
  18672.     subq.w    #1,d0
  18673.     bcs    clc_mdtr0
  18674. @@:
  18675.     add.b    (a4)+,d4
  18676.     dbra    d0,@b
  18677. clc_mdtr0:
  18678.     move.b    (a4)+,d0
  18679.     lsl.w    #8,d0
  18680.     move.b    (a4)+,d0
  18681.     add.w    d0,d4            *checksum
  18682.     swap    d0
  18683.     move.b    (a4)+,d0
  18684.     lsl.w    #8,d0
  18685.     move.b    (a4)+,d0
  18686.     add.w    d0,d4            *checksum
  18687. @@:
  18688.     add.b    (a4)+,d4        *checksum
  18689.     subq.l    #1,d0
  18690.     bne    @b
  18691.     bra    getzmdlp
  18692.  
  18693. clc_asgn_arcc:                *ARCCアサイン            ($f7)
  18694.     add.b    (a4)+,d4        *arcc no.
  18695.     move.b    (a4)+,d0        *omt
  18696.     add.b    d0,d4
  18697. clc_asarlp:                *omt中のビット=1の数だけパラメータが後続する
  18698.     add.b    d0,d0
  18699.     bcc    @f
  18700.     add.b    (a4)+,d4
  18701. @@:
  18702.     tst.b    d0
  18703.     bne    clc_asarlp
  18704.     bra    getzmdlp
  18705.  
  18706. clc_loop:                *ループ終端
  18707. @@:
  18708.     move.b    (a4)+,d0
  18709.     lsl.w    #8,d0
  18710.     move.b    (a4)+,d0        *get offste high
  18711.     add.w    d0,d4            *checksum
  18712.     swap    d0
  18713.     move.b    (a4)+,d0
  18714.     lsl.w    #8,d0
  18715.     move.b    (a4)+,d0        *get offset low
  18716.     add.w    d0,d4            *checksum
  18717.     tst.l    d0
  18718.     bne    @b
  18719.     bra    getzmdlp
  18720.  
  18721. clc_msln:                *小節線($fd)
  18722.     tst.b    clc_phase-work(a6)
  18723.     ble    getzmdlp        *minus or zero
  18724.     addq.l    #1,d6            *inc measure no.
  18725.     move.l    d5,(a3)+        *step
  18726.     clr.w    (a3)+            *checksum
  18727.     move.w    d4,(a3)+        *checksum
  18728.     moveq.l    #0,d0
  18729.     move.w    d4,d0
  18730.     swap    d0
  18731.     add.l    d0,d4            *上位ワードに総チェックサムとして足し込む
  18732.     moveq.l    #0,d5            *init. step
  18733.     move.w    d5,d4            *init. checksum
  18734.     cmp.l    a5,a3
  18735.     bcs    getzmdlp
  18736.     move.l    clc_buf_size(pc),d2
  18737.     add.l    #1024,d2        *1024バイト分追加確保
  18738.     move.l    clc_buf_addr(pc),a1
  18739.     bsr    enlarge_mem
  18740.     tst.l    d0
  18741.     bmi    t_out_of_memory_clc
  18742.     sub.l    clc_buf_addr(pc),a3
  18743.     lea    (a0,a3.l),a3
  18744.     sub.l    clc_buf_addr(pc),a2
  18745.     lea    (a0,a2.l),a2
  18746.     move.l    a0,clc_buf_addr-work(a6)
  18747.     move.l    d2,clc_buf_size-work(a6)
  18748.     lea    (a0,d2.l),a5        *領域最終アドレスも更新
  18749.     bra    getzmdlp
  18750.  
  18751. tmp_buf_addr:    ds.l    1
  18752. tmp_buf_size:    ds.l    1
  18753. clc_buf_addr:    ds.l    1
  18754. clc_buf_size:    ds.l    1
  18755. clc_ret_addr:    ds.l    1
  18756. clc_seq_flag:    ds.l    1    *d0:d.c. flag / d1:fine flag
  18757. *-------seq cmd---------------------------------------------------------------
  18758. *0:d.c.  1:do  2:!  3:@     4:key  5:meter
  18759. clc_seq_cmd:
  18760.     moveq.l    #0,d0
  18761.     move.b    (a4)+,d0            *event number
  18762.     add.b    d0,d4
  18763.     move.b    (a4)+,d1            *n of param
  18764.     add.b    d1,d4
  18765.     cmpi.b    #end_of_scc,d0
  18766.     bhi    t_undefined_zmd_code_clc
  18767.     add.w    d0,d0
  18768.     move.w    @f(pc,d0.w),d0
  18769.     jmp    @f(pc,d0.w)
  18770. @@:
  18771.     dc.w    dc_clc-@b    *0
  18772.     dc.w    do_clc-@b    *1
  18773.     dc.w    skip_scc_np-@b    *2
  18774.     dc.w    skip_scc_np-@b    *3
  18775.     dc.w    skip_scc_np-@b    *4
  18776.     dc.w    skip_scc_np-@b    *5
  18777. dc_clc:                        *[D.C.]
  18778.     btst.b    #0,clc_seq_flag-work(a6)
  18779.     bne    getzmdlp            *すでに一回実行した
  18780.     cmpi.b    #coda_zmd,(a4)
  18781.     beq    @f
  18782.     move.l    rcgz_addr(pc),a4
  18783.     or.b    #%11,clc_seq_flag-work(a6)
  18784.     bra    getzmdlp
  18785. @@:
  18786.     add.b    (a4)+,d4
  18787.     bsr    clc_do_segno_coda        *続く[coda]を認識させる
  18788.     move.l    rcgz_addr(pc),a4
  18789.     or.b    #%11,clc_seq_flag-work(a6)
  18790.     bra    mng_clc_mem
  18791. do_clc:                        *[do]
  18792.     move.l    d7,clc_otlp_step-work(a6)    *[do]までの総ステップタイム保存
  18793.     move.b    #1,dlp_clc_flg-work(a6)
  18794.     bra    getzmdlp
  18795.  
  18796. skip_scc_np:
  18797.     tst.b    d1
  18798.     beq    getzmdlp
  18799. @@:
  18800.     add.b    (a4)+,d4            *params
  18801.     subq.b    #1,d1
  18802.     bne    @b
  18803.     bra    getzmdlp
  18804. *-------segno-----------------------------------------------------------------
  18805. clc_coda:
  18806. clc_segno:
  18807.     bsr    clc_do_segno_coda
  18808.     bra    mng_clc_mem
  18809.  
  18810. clc_ds:                    *[d.s.]処理([SEGNO]へジャンプ)
  18811.     move.l    tmp_buf_addr(pc),a0
  18812. @@:
  18813.     move.l    (a0)+,d0
  18814.     beq    exit_dsop_clc        *error(通常はこんなことはあり得ない)
  18815.     cmp.l    a4,d0
  18816.     beq    @f
  18817.     addq.w    #2,a0
  18818.     bra    @b
  18819. @@:
  18820.     addq.w    #1,a0
  18821.     move.b    (a0),d0            *get flag
  18822.     bpl    exit_dsop_clc        *[segno]がなかったので無視
  18823.     add.b    d0,d0            *check d.s. done flag
  18824.     bmi    exit_dsop_clc        *[d.s.]一度処理したことがあるので無視
  18825.     bset.b    #6,(a0)            *set d.s. done flag
  18826.     bset.b    #1,clc_seq_flag-work(a6)    *set p_fine_flg
  18827.     addq.w    #1,a4            *skip flag
  18828.     move.b    (a4)+,d1        *get offset(.L)
  18829.     lsl.w    #8,d1
  18830.     move.b    (a4)+,d1
  18831.     add.w    d1,d4
  18832.     swap    d1
  18833.     move.b    (a4)+,d1
  18834.     lsl.w    #8,d1
  18835.     move.b    (a4)+,d1
  18836.     add.w    d1,d4
  18837.     cmpi.b    #coda_zmd,(a4)
  18838.     bne    @f
  18839.     pea    (a4,d1.l)
  18840.     addq.w    #1,a4
  18841.     bsr    clc_do_segno_coda
  18842.     move.l    (sp)+,a4
  18843.     bra    mng_clc_mem
  18844. @@:
  18845.     adda.l    d1,a4
  18846.     bra    getzmdlp
  18847. exit_dsop_clc:
  18848.     addq.w    #5,a4
  18849.     bra    getzmdlp
  18850. *-------coda------------------------------------------------------------------
  18851. clc_do_segno_coda:
  18852.     * - d1
  18853.     move.b    (a4)+,d0        *get offset(.L)
  18854.     lsl.w    #8,d0
  18855.     move.b    (a4)+,d0
  18856.     add.w    d0,d4
  18857.     swap    d0
  18858.     move.b    (a4)+,d0
  18859.     lsl.w    #8,d0
  18860.     move.b    (a4)+,d0
  18861.     add.w    d0,d4
  18862.     move.l    tmp_buf_addr(pc),a0
  18863.     tst.l    d0            *0の場合はコマンド無視ケース
  18864.     beq    exit_dsgcdcl
  18865.     lea    (a4,d0.l),a1
  18866. @@:                *リピートアドレス登録
  18867.     move.l    (a0)+,d2
  18868.     beq    @f
  18869.     cmp.l    a1,d2
  18870.     beq    dsgcdcl0
  18871.     addq.w    #2,a0
  18872.     bra    @b
  18873. @@:
  18874.     move.l    a1,-4(a0)    *登録
  18875. dsgcdcl0:
  18876.     clr.w    (a0)+        *init. work
  18877.     tas.b    -(a0)        *set segno flag
  18878.     bclr.b    #6,(a0)+    *clr d.s. done flag
  18879.     clr.l    (a0)+        *end code
  18880. exit_dsgcdcl:
  18881.     rts
  18882.  
  18883. clc_tocoda:                *[tocoda]処理([coda]へジャンプ)
  18884.     move.l    tmp_buf_addr(pc),a0
  18885. @@:
  18886.     move.l    (a0)+,d0
  18887.     beq    exit_tocd_clc
  18888.     cmp.l    a4,d0
  18889.     beq    @f
  18890.     addq.w    #2,a0
  18891.     bra    @b
  18892. @@:
  18893.     addq.w    #1,a0
  18894.     move.b    (a0),d0            *get flag
  18895.     bpl    exit_tocd_clc        *[coda]がなかったので無視
  18896.     add.b    d0,d0            *check tocoda done flag
  18897.     bmi    exit_tocd_clc        *[tocoda]一度処理したことがあるので無視
  18898.     bset.b    #6,(a0)            *set tocoda done flag
  18899.     addq.w    #1,a4            *skip flag
  18900.     move.b    (a4)+,d0        *get offset(.L)
  18901.     lsl.w    #8,d0
  18902.     move.b    (a4)+,d0
  18903.     add.w    d0,d4
  18904.     swap    d0
  18905.     move.b    (a4)+,d0
  18906.     lsl.w    #8,d0
  18907.     move.b    (a4)+,d0
  18908.     add.w    d0,d4
  18909.     adda.l    d0,a4
  18910.     bra    getzmdlp
  18911. exit_tocd_clc:
  18912.     addq.w    #5,a4
  18913.     bra    getzmdlp
  18914. *-------fine------------------------------------------------------------------
  18915. clc_fine:                    *[fine]処理
  18916.     btst.b    #1,clc_seq_flag-work(a6)
  18917.     beq    getzmdlp
  18918.     bra    clc_next_tr
  18919. *-------skip------------------------------------------------------------------
  18920. clc_skip:
  18921.     moveq.l    #0,d1
  18922.     move.b    (a4)+,d1
  18923.     add.w    d0,d4
  18924.     move.b    (a4)+,d0
  18925.     lsl.w    #8,d0
  18926.     move.b    (a4)+,d0
  18927.     add.w    d0,d4
  18928.     swap    d0
  18929.     move.b    (a4)+,d0
  18930.     lsl.w    #8,d0
  18931.     move.b    (a4)+,d0
  18932.     add.w    d0,d4
  18933.     tst.b    d1
  18934.     bne    @f
  18935.     adda.l    d0,a4        *相対値ケース
  18936.     rts
  18937. @@:                *直値ケース
  18938.     move.l    d0,a4
  18939.     rts
  18940. *-------gosub return----------------------------------------------------------
  18941. clc_gosub:
  18942.     moveq.l    #0,d0
  18943.     move.b    (a4)+,d0
  18944.     lsl.w    #8,d0
  18945.     move.b    (a4)+,d0        *track no.
  18946.     add.w    d0,d4
  18947.     move.l    clc_trk_base(pc),a1    *トラック情報テーブルの先頭アドレス
  18948.     cmpi.w    #65535,d0
  18949.     bne    @f
  18950.     move.l    clc_ptn_trk(pc),d1    *pattern track
  18951.     beq    m_pattern_not_available    *パターントラックは使用できない
  18952.     move.l    d1,a1
  18953.     bra    gsbcl0
  18954. @@:
  18955.     lsl.l    #ti_size_,d0
  18956.     add.l    d0,a1
  18957. gsbcl0:
  18958.     move.l    ti_play_data(a1),d0
  18959.     lea    ti_play_data+4(a1,d0.l),a1    *performance data top addr
  18960.     move.b    (a4)+,d0
  18961.     lsl.w    #8,d0
  18962.     move.b    (a4)+,d0
  18963.     add.w    d0,d4
  18964.     swap    d0
  18965.     move.b    (a4)+,d0
  18966.     lsl.w    #8,d0
  18967.     move.b    (a4)+,d0
  18968.     add.w    d0,d4
  18969.     move.l    a4,clc_ret_addr-work(a6)
  18970.     lea    (a1,d0.l),a4
  18971.     bra    getzmdlp
  18972.  
  18973. clc_return:
  18974.     move.l    clc_ret_addr(pc),d0
  18975.     beq    getzmdlp
  18976.     clr.l    clc_ret_addr-work(a6)
  18977.     move.l    d0,a4
  18978.     bra    getzmdlp
  18979. *-------repeat control command------------------------------------------------
  18980. clc_repeat_start:        *|:n処理
  18981.     move.l    tmp_buf_addr(pc),a0
  18982. @@:                *リピートアドレス登録
  18983.     move.l    (a0)+,d2
  18984.     beq    @f
  18985.     cmp.l    a4,d2
  18986.     beq    rpstclc0
  18987.     addq.w    #2,a0
  18988.     bra    @b
  18989. @@:
  18990.     move.l    a4,-4(a0)    *登録
  18991. rpstclc0:
  18992.     clr.w    (a0)+        *init. work
  18993.     clr.l    (a0)+        *end code
  18994.  
  18995.     move.b    (a4)+,d2
  18996.     lsl.w    #8,d2
  18997.     move.b    (a4)+,d2
  18998.     add.w    d2,d4        *calc checksum(repeat counter)
  18999.     addq.w    #2,a4
  19000. mng_clc_mem:
  19001.     * < a0.l=tmp_buf_addr+x
  19002.     sub.l    tmp_buf_addr(pc),a0
  19003.     addq.w    #6,a0
  19004.     move.l    tmp_buf_size(pc),d2
  19005.     cmp.l    d2,a0
  19006.     bcs    getzmdlp
  19007.     add.l    #1024,d2        *1024バイト分追加確保
  19008.     move.l    tmp_buf_addr(pc),a1
  19009.     bsr    enlarge_mem
  19010.     tst.l    d0
  19011.     bmi    t_out_of_memory_clc
  19012.     move.l    a0,tmp_buf_addr-work(a6)
  19013.     move.l    d2,tmp_buf_size-work(a6)
  19014.     bra    getzmdlp
  19015.  
  19016. clc_repeat_end:            *:|処理
  19017.     move.b    (a4)+,d0
  19018.     lsl.w    #8,d0
  19019.     move.b    (a4)+,d0    *d0.w=offset value
  19020.     add.w    d0,d4        *calc checksum
  19021.     swap    d0
  19022.     move.b    (a4)+,d0
  19023.     lsl.w    #8,d0
  19024.     move.b    (a4)+,d0    *d0.w=offset value
  19025.     add.w    d0,d4        *calc checksum
  19026.     move.l    a4,d2        *現在のアドレスを保存
  19027.     suba.l    d0,a4        *a4.l=rept.count
  19028.  
  19029.     move.l    tmp_buf_addr(pc),a0
  19030. @@:
  19031.     move.l    (a0)+,d0
  19032.     beq    rpedc0        *error(通常はこんなことはあり得ない)
  19033.     cmp.l    a4,d0
  19034.     beq    @f
  19035.     addq.w    #2,a0
  19036.     bra    @b
  19037. @@:
  19038.     move.b    (a4)+,d0
  19039.     lsl.w    #8,d0
  19040.     move.b    (a4)+,d0    *希望リピート回数
  19041.     cmp.w    (a0),d0        *繰り返し回数とカウンタを比較
  19042.     bne    @f        *繰り返しを続行
  19043. rpedc0:
  19044.     move.l    d2,a4        *リピートしないで次へ
  19045.     bra    getzmdlp
  19046. @@:
  19047.     addq.w    #1,(a0)        *inc 繰り返し回数
  19048.     addq.w    #2,a4        *inc rep.work分
  19049.     bra    getzmdlp
  19050.  
  19051. clc_repeat_skip:        *|n処理
  19052.     move.b    (a4)+,d2
  19053.     lsl.w    #8,d2
  19054.     move.b    (a4)+,d2    *条件成立希望ループ回数値
  19055.     add.w    d2,d4        *calc checksum
  19056.     move.b    (a4)+,d0
  19057.     lsl.w    #8,d0
  19058.     move.b    (a4)+,d0
  19059.     add.w    d0,d4        *calc checksum
  19060.     swap    d0
  19061.     move.b    (a4)+,d0    *get count work offset
  19062.     lsl.w    #8,d0
  19063.     move.b    (a4)+,d0    *d0.l=offset value
  19064.     add.w    d0,d4        *calc checksum
  19065.     lea    -2(a4),a1
  19066.     suba.l    d0,a1        *a1.l=rept.count
  19067.     move.l    tmp_buf_addr(pc),a0
  19068. @@:
  19069.     move.l    (a0)+,d0
  19070.     beq    rpskp0        *error(通常はこんなことはあり得ない)
  19071.     cmp.l    a1,d0
  19072.     beq    @f
  19073.     addq.w    #2,a0
  19074.     bra    @b
  19075. @@:
  19076.     cmp.w    (a0),d2        *count workと比較
  19077.     bne    @f
  19078.     addq.w    #4,a4        *skip jumping offset
  19079.     bra    getzmdlp    *|n以降の演奏データを実行する
  19080. @@:                *繰り返し処理から脱ける
  19081. rpskp0:
  19082.     move.b    (a4)+,d0
  19083.     lsl.w    #8,d0
  19084.     move.b    (a4)+,d0
  19085.     add.w    d0,d4        *calc checksum
  19086.     swap    d0
  19087.     move.b    (a4)+,d0
  19088.     lsl.w    #8,d0
  19089.     move.b    (a4)+,d0    *d0.l=jumping offset
  19090.     add.w    d0,d4        *calc checksum
  19091.     adda.l    d0,a4        *オフセットを足して次の|nや:|へ
  19092.     bra    getzmdlp
  19093.  
  19094. clc_repeat_skip2:        *|処理(nが省略時のケース)
  19095.     move.b    (a4)+,d0
  19096.     lsl.w    #8,d0
  19097.     move.b    (a4)+,d0
  19098.     add.w    d0,d4        *calc checksum
  19099.     swap    d0
  19100.     move.b    (a4)+,d0    *get count work offset
  19101.     lsl.w    #8,d0
  19102.     move.b    (a4)+,d0    *d0.l=offset value
  19103.     add.w    d0,d4        *calc checksum
  19104.     lea    -2(a4),a1
  19105.     suba.l    d0,a1        *a1.l=rept.count
  19106.     move.l    tmp_buf_addr(pc),a0
  19107. @@:
  19108.     move.l    (a0)+,d0
  19109.     beq    rpskp2        *error(通常はこんなことはあり得ない)
  19110.     cmp.l    a1,d0
  19111.     beq    @f
  19112.     addq.w    #2,a0
  19113.     bra    @b
  19114. @@:
  19115.     move.b    (a1)+,d1
  19116.     lsl.w    #8,d1
  19117.     move.b    (a1)+,d1
  19118.     cmp.w    (a0),d1        *count workとリピート回数を比較
  19119.     beq    @f
  19120. rpskp2:
  19121.     addq.w    #4,a4        *skip offset
  19122.     bra    getzmdlp    *|以降の演奏データを実行する
  19123. @@:                *リピート最後なので脱ける
  19124.     move.b    (a4)+,d0
  19125.     lsl.w    #8,d0
  19126.     move.b    (a4)+,d0
  19127.     add.w    d0,d4        *calc checksum
  19128.     swap    d0
  19129.     move.b    (a4)+,d0
  19130.     lsl.w    #8,d0
  19131.     move.b    (a4)+,d0    *d0.l=offset
  19132.     add.w    d0,d4        *calc checksum
  19133.     adda.l    d0,a4        *オフセットを足して:|または次の| or |nへ
  19134.     bra    getzmdlp
  19135. *-----------------------------------------------------------------------------
  19136. calc_total:                    *各トラックのステップタイムの合計を求める
  19137.     *   cmd=$67
  19138.     * < a1.l=ZMD address    (ヘッダはなくても有ってもいい
  19139.     *             ヘッダがある場合はバージョンチェックをする)
  19140.     *    =0ならばa0.l=zmlentblを返す
  19141.     * > d0.l=0:no error
  19142.     * > a0.l=結果格納アドレス(使用後開放すること)(ZCLABEL.MAC参照)
  19143.     * > d0.l=n of error
  19144.     * > a0.l=error table(使用後開放すること)
  19145.     lea    work,a6
  19146.     move.l    a1,d0
  19147.     bne    @f
  19148.     lea    zmlentbl(pc),a0
  19149.     moveq.l    #0,d0
  19150.     rts
  19151. @@:
  19152.     move.l    sp,sp_buf-work(a6)        *スタック保存
  19153.     move.b    #ZM_CALC_TOTAL,zmc_call-work(a6)
  19154.     move.l    a1,zmd_top-work(a6)
  19155.     moveq.l    #0,d5
  19156.     move.w    d5,clc_phase-work(a6)        *phase 1,dlp_clc_flg
  19157.     move.l    d5,clc_play_time-work(a6)
  19158.     move.l    d5,clc_ttl_steptime-work(a6)
  19159.     move.l    d5,clc_ttl_checksum-work(a6)
  19160.     move.l    d5,n_of_err-work(a6)
  19161.     move.l    d5,n_of_warn-work(a6)
  19162.     move.l    d5,err_stock_addr-work(a6)
  19163.     move.l    d5,err_stock_size-work(a6)
  19164.  
  19165.     cmpi.l    #ZmuSiC0,(a1)            *$1a,'Zmu'
  19166.     bne    1f
  19167.     move.l    4(a1),d0
  19168.     clr.b    d0
  19169.     cmpi.l    #ZmuSiC1,d0            *'Sic',version(.b)
  19170.     bne    t_unidentified_file_clc
  19171.     cmpi.b    #v_code,7(a1)
  19172.     bcs    t_illegal_version_number_clc
  19173.     move.w    z_tempo(a1),d5
  19174.     tst.l    z_play_time(a1)
  19175.     beq    @f
  19176.     tas.b    clc_phase-work(a6)        *元々設定されているならば計算不要マーク
  19177. @@:
  19178.     addq.w    #8,a1                *skip header
  19179.     bra    2f
  19180. 1:                        *ヘッダ無しの場合
  19181.     move.w    z_tempo-8(a1),d5
  19182.     subq.l    #8,zmd_top-work(a6)        *header分差引く
  19183.     tst.l    z_play_time-8(a1)
  19184.     beq    2f
  19185.     tas.b    clc_phase-work(a6)        *元々設定されているならば計算不要マーク
  19186. 2:
  19187.     tst.b    clc_phase-work(a6)
  19188.     bmi    @f
  19189.     move.l    #1024,d2            *テンポマップ用ワークエリア
  19190.     move.l    #ID_TEMP,d3            *phase 1で使用
  19191.     bsr    get_mem
  19192.     tst.l    d0
  19193.     bmi    t_out_of_memory_clc
  19194.     move.l    a0,tempo_map_addr-work(a6)    *tempo_map_now(.l),
  19195.     move.l    d2,tempo_map_size-work(a6)    *累積ステップタイム(.l),テンポ(.l)
  19196.     clr.l    (a0)+                *tempo_map_now=0
  19197.     clr.l    (a0)+                *累積step初期化
  19198.     move.l    d5,(a0)+            *初期テンポ
  19199. @@:
  19200.     move.l    #1032,d2            *6の倍数
  19201.     move.l    #ID_TEMP,d3            *address-ID(.L),counter(.W)という構造
  19202.     bsr    get_mem                *phase 1,2で使用
  19203.     tst.l    d0
  19204.     bmi    t_out_of_memory_clc
  19205.     move.l    a0,tmp_buf_addr-work(a6)    *保存
  19206.     move.l    d2,tmp_buf_size-work(a6)    *保存
  19207.  
  19208.     move.l    #1024,d2
  19209.     move.l    #ID_CALC,d3            *phase 2で使用
  19210.     bsr    get_mem
  19211.     tst.l    d0
  19212.     bmi    t_out_of_memory_clc
  19213.     move.l    a0,clc_buf_addr-work(a6)    *保存
  19214.     move.l    d2,clc_buf_size-work(a6)    *保存
  19215.     lea    1024(a0),a5            *block end addr.
  19216.  
  19217.     move.l    a0,a2
  19218.     moveq.l    #8-1,d0                *グローバルリザルトの数=8
  19219. @@:
  19220.     clr.l    (a2)+
  19221.     dbra    d0,@b
  19222.     move.w    #-1,(a2)            *演奏データがない場合のために初期化
  19223.                         *演奏時間計算処理用
  19224.     move.l    (a1)+,d0            *共通コマンド部までのオフセット
  19225. *    beq    @f
  19226. *    lea    (a1,d0.l),a0
  19227. *    bsr    getset_cmn            *共通コマンド処理
  19228. *@@:
  19229.     move.l    (a1)+,d0            *演奏トラック情報テーブルまでのオフセット
  19230.     beq    clc_ttl_end            *演奏データ無し
  19231.     add.l    d0,a1                *a1=trk情報テーブル
  19232.     moveq.l    #0,d2
  19233.     move.w    (a1)+,d2            *d2=総トラック数-1(0-65535)
  19234.     move.l    d2,d0
  19235.     lsl.l    #2,d0                *4
  19236.     lea    4(a2,d0.l),a3
  19237.     move.w    #-1,(a3)+            *エンドコードを前もってセット
  19238.     move.l    a1,clc_trk_base-work(a6)    *トラック情報テーブルのベースアドレス
  19239.                         *PATTERN TRACKのアドレスを取り出す(なければ0)
  19240.     move.l    a1,a4
  19241.     move.w    d2,d0
  19242. @@:
  19243.     cmpi.b    #ID_PATTERN,(a4)
  19244.     beq    @f
  19245.     add.w    #ti_size,a4
  19246.     dbra    d0,@b
  19247.     suba.l    a4,a4                *パターントラックがない場合は0
  19248. @@:
  19249.     move.l    a4,clc_ptn_trk-work(a6)
  19250.     tst.b    clc_phase-work(a6)
  19251.     bmi    clc_ttl_phase        *ステップタイム計算フェーズへ
  19252.     movem.l    d2/a1,-(sp)
  19253. clc_ttl_lp00:                *< a0.l=結果テーブルの先頭/a3.l=情報ストア領域
  19254.     movem.l    d2/a1,-(sp)        *総トラック総チェックサムをあとで格納するため(offset値)
  19255. *****************************************テンポマップ作成フェーズ
  19256.     move.l    zmd_top(pc),a4        *phase 1
  19257.     move.l    z_master_clock(a4),clc_mst_clk-work(a6)    *clc_mst_clk,clc_tempo
  19258.  
  19259.     move.l    ti_play_data(a1),d0
  19260.     lea    ti_play_data+4(a1,d0.l),a4    *performance data top addr
  19261.     moveq.l    #0,d7                *track total
  19262.                         *特殊処理が必要なZMDの関連ワークの初期化
  19263.     move.l    d7,clc_ret_addr-work(a6)
  19264.     move.l    d7,clc_seq_flag-work(a6)
  19265.     move.l    tmp_buf_addr-work(a6),a0
  19266.     move.l    d7,(a0)                *init.
  19267.     moveq.l    #0,d0
  19268.     move.b    ti_trkfrq(a1),d0
  19269.     addq.w    #1,d0
  19270.     move.w    d0,clc_trkfrq-work(a6)
  19271.     cmpi.w    #DEV_PATTERN,ti_type(a1)
  19272.     beq    @f
  19273.     bsr    recognize_zmd_ope        *ZMD認識処理
  19274. @@:
  19275.     movem.l    (sp)+,d2/a1
  19276.     add.w    #ti_size,a1            *次のトラックへ
  19277.     dbra    d2,clc_ttl_lp00
  19278.  
  19279.     move.l    tempo_map_addr(pc),a1        *テンポマップ確定
  19280.     move.l    (a1)+,d2
  19281.     lea    (a1,d2.l),a0
  19282. *    beq    @f                *d2がゼロならば
  19283. *    subq.w    #8,a0
  19284. *@@:
  19285.     move.l    a1,-(a1)            *初期化
  19286.     move.l    a0,tempo_map_size-work(a6)    *最終要素アドレスを指すようになる
  19287.     tst.l    d2
  19288.     beq    @f
  19289.     bsr    enlarge_mem
  19290. @@:
  19291.     movem.l    (sp)+,d2/a1
  19292. ****************************************ステップタイム計算フェーズ
  19293. clc_ttl_phase:
  19294.     addq.b    #1,clc_phase-work(a6)    *phase 2
  19295. clc_ttl_lp01:                *< a0.l=結果テーブルの先頭/a3.l=情報ストア領域
  19296.     move.l    a3,d0
  19297.     sub.l    clc_buf_addr(pc),d0
  19298.     movem.l    d0/d2/a1,-(sp)        *総トラック総チェックサムをあとで格納するため(offset値)
  19299.     move.l    a3,d0
  19300.     subq.l    #4,d0
  19301.     sub.l    a2,d0
  19302.     move.l    d0,(a2)+        *情報までのオフセット値を格納
  19303.     add.w    #clc_ttlrsltsz,a3    *tr0 step(l),tr1 step(l),checksum(l),n of mes.(l)
  19304.  
  19305.     move.l    zmd_top(pc),a4
  19306.     move.w    z_tempo(a4),clc_tempo-work(a6)
  19307.  
  19308.     move.l    ti_play_data(a1),d0
  19309.     lea    ti_play_data+4(a1,d0.l),a4    *performance data top addr
  19310.     moveq.l    #0,d4                *check sum(hw=total,lw=measure)
  19311.     moveq.l    #0,d5                *total step in a measure
  19312.     moveq.l    #0,d6                *num of measure
  19313.     moveq.l    #0,d7                *track total
  19314.                         *特殊処理が必要なZMDの関連ワークの初期化
  19315.     move.l    d7,_clc_play_time-work(a6)
  19316.     move.l    d7,clc_ret_addr-work(a6)
  19317.     move.l    d7,clc_seq_flag-work(a6)
  19318.     move.l    d7,clc_otlp_step-work(a6)    *ループ外の総ステップ初期化
  19319.     move.l    tmp_buf_addr-work(a6),a0
  19320.     move.l    d7,(a0)                *init.
  19321.     moveq.l    #0,d0
  19322.     move.b    ti_trkfrq(a1),d0
  19323.     addq.w    #1,d0
  19324.     move.w    d0,clc_trkfrq-work(a6)
  19325.     cmpi.w    #DEV_PATTERN,ti_type(a1)
  19326.     beq    @f
  19327.     bsr    recognize_zmd_ope        *ZMD認識処理
  19328. @@:
  19329.     movem.l    (sp)+,d0/d2/a1
  19330.     move.l    clc_buf_addr(pc),a0
  19331.     add.l    d0,a0
  19332.     move.l    d7,d0
  19333.     tst.b    dlp_clc_flg-work(a6)        *[do]-[loop]があったか
  19334.     beq    @f
  19335.     move.l    clc_otlp_step-work(a6),d1
  19336.     move.l    d1,(a0)+            *ループ外トラック総ステップ
  19337.     sub.l    d1,d0
  19338.     move.l    d0,(a0)+            *ループ内トラック総ステップ
  19339.     bra    1f
  19340. @@:
  19341.     move.l    d0,(a0)+            *ループ外トラック総ステップ
  19342.     clr.l    (a0)+                *ループ内トラック総ステップ
  19343. 1:
  19344.     cmp.l    clc_ttl_steptime(pc),d7
  19345.     bls    @f
  19346.     move.l    d7,clc_ttl_steptime-work(a6)
  19347. @@:
  19348.     moveq.l    #0,d0
  19349.     move.w    d4,d0
  19350.     swap    d4
  19351.     add.w    d4,d0            *端数加算
  19352.     add.l    d0,clc_ttl_checksum-work(a6)
  19353.     move.l    d0,(a0)+        *トラック総チェックサム
  19354.     move.l    d6,(a0)+        *トラック総小節数
  19355.     move.l    _clc_play_time(pc),d0
  19356.     cmp.l    clc_play_time(pc),d0
  19357.     bls    @f
  19358.     move.l    d0,clc_play_time-work(a6)
  19359. @@:
  19360.     add.w    #ti_size,a1        *次のトラックへ
  19361.     dbra    d2,clc_ttl_lp01
  19362. clc_ttl_end:                *終わり
  19363.     move.l    clc_buf_addr(pc),a0
  19364.     move.l    zmd_top(pc),a1
  19365.     move.l    clc_ttl_steptime(pc),d0
  19366.     move.l    d0,z_total_count(a1)
  19367.     tst.b    clc_phase-work(a6)
  19368.     bmi    1f
  19369.     move.l    d0,(a0)+
  19370.     move.l    clc_ttl_checksum(pc),(a0)+
  19371.     lea    z_play_time+4(a1),a1
  19372.     move.w    clc_play_time+2(pc),d0
  19373.     mulu    #60,d0
  19374.     clr.w    d0
  19375.     swap    d0            *d0.b=秒
  19376.     divu    #60,d0
  19377.     move.l    d0,d1
  19378.     clr.w    d0
  19379.     swap    d0            *d0.w=秒
  19380.     move.b    d0,-(a1)        *write 秒
  19381.     andi.l    #$ffff,d1        *d1.w=分
  19382.     moveq.l    #0,d0
  19383.     move.w    clc_play_time(pc),d0
  19384.     add.l    d0,d1
  19385.     divu    #60,d1            *d1.w=時間
  19386.     move.l    d1,d0
  19387.     swap    d0            *d0.w=分
  19388. @@:
  19389.     move.b    d0,-(a1)        *write 分
  19390.     move.w    d1,-(a1)        *write 時間
  19391.     move.l    (a1),(a0)+        *total playtime
  19392.     bra    clc_exit
  19393. 1:                    *ZMDから結果を取り出す場合
  19394.     move.l    z_total_count(a1),(a0)+
  19395.     move.l    clc_ttl_checksum(pc),(a0)+
  19396.     move.l    z_play_time(a1),(a0)+
  19397. clc_exit:
  19398.     bsr    rel_clctmpmem
  19399.     move.l    clc_buf_addr(pc),a0    *計算結果格納アドレス
  19400.     moveq.l    #0,d0            *no error
  19401.     rts
  19402.  
  19403. rel_clctmpmem:
  19404.     tst.b    clc_phase-work(a6)
  19405.     bmi    @f
  19406.     move.l    tempo_map_addr(pc),a1
  19407.     bsr    free_mem        *テンポマップ開放
  19408. @@:
  19409.     move.l    tmp_buf_addr(pc),a1
  19410.     bra    free_mem        *テンポラリ開放
  19411.  
  19412. recognize_zmd_ope:            *ZMDの認識処理
  19413.     * < a4.l=zmd addr
  19414.     move.l    a4,rcgz_addr-work(a6)    *先頭アドレスキープ
  19415. getzmdlp:
  19416.     moveq.l    #0,d0
  19417.     move.b    (a4)+,d0
  19418.     bpl    case_clcky        *通常発音音階
  19419.     cmpi.b    #$ff,d0            *end of track
  19420.     beq    clc_next_tr        *go next track
  19421.     add.w    d0,d4            *checksum
  19422.     add.b    d0,d0            *最上位ビット殺す
  19423.     add.w    d0,d0
  19424.     move.l    zmlentbl(pc,d0.w),d0
  19425.     beq    t_undefined_zmd_code_clc
  19426.     cmpi.l    #$100,d0
  19427.     bls    @f
  19428.     move.l    d0,a1
  19429.     jmp    (a1)            *可変長ZMD
  19430. @@:                    *固定長ZMD
  19431.     subq.w    #2,d0            *minus 1 for dbra, another minus 1 for cmd length
  19432.     bcs    getzmdlp
  19433. @@:
  19434.     move.b    (a4)+,d1
  19435.     ext.w    d1
  19436.     add.w    d1,d4        *calc sum
  19437.     dbra    d0,@b
  19438.     bra    getzmdlp
  19439. clc_next_tr:
  19440.     rts
  19441.                 *それぞれのZMD長を基本値とし最上位ビット=1の場合は
  19442. zmlentbl:            *そのZMDが可変長であることを意味する。7ビットは可変長ZMDに
  19443.                 *対して便宜上付けた番号
  19444.     dc.l    clc_rest            *$80 do_rest
  19445.     dc.l    clc_wait            *$81 do_wait
  19446.     dc.l    clc_track_delay            *$82 track delay
  19447.     dc.l    clc_mx_key            *$83 mx_key
  19448.     dc.l    clc_portament            *$84 portament
  19449.     dc.l    clc_portament            *$85 portament
  19450.     dc.l    0,0
  19451.     dc.l    0,0,0,0,0,0,0,0
  19452.     dc.l    2,2,2,2,2,2,2,4            *$90~ all 2bytes
  19453.     dc.l    2,2,4,2,2,4,2,2         *~$9f all 2bytes
  19454.     dc.l    2,2,2,2,2,2,2,2            *$a0~ all 2bytes
  19455.     dc.l    2,2,2,2,2,4,2,2         *~$af all 2bytes
  19456.     dc.l    3,3,3,3,3,5,3,3            *$b0~ all 3bytes
  19457.     dc.l    3,3,3,3,3,3,3,3         *~$bf all 3bytes
  19458.     dc.l    3,3,3                *$c0~$c2 all 3bytes
  19459.     dc.l    clc_tempo_t            *$c3 tempo
  19460.     dc.l    clc_rltv_t            *$c4 relative tempo
  19461.     dc.l    clc_seq_cmd            *$c5 [...]
  19462.     dc.l    3,3,3                *$c6~$c8 all 3bytes
  19463.     dc.l    4,4                *$c9~$ca all 4bytes
  19464.     dc.l    5,5                *$cb~$cc all 5bytes
  19465.     dc.l    clc_repeat_start        *$cd clc_repeat_start
  19466.     dc.l    clc_repeat_end            *$ce clc_repeat_end
  19467.     dc.l    5                 *$cf all 5bytes
  19468.     dc.l    clc_segno            *$d0 segno
  19469.     dc.l    clc_coda            *$d1 coda
  19470.     dc.l    clc_skip            *$d2 skip
  19471.     dc.l    clc_ds                *$d3 ds
  19472.     dc.l    clc_tocoda            *$d4 ToCoda
  19473.     dc.l    clc_gosub            *$d5 clc_gosub
  19474.     dc.l    clc_ch_fader            *$d6 ch fader
  19475.     dc.l    clc_mstr_fader            *$d7 master fader
  19476.     dc.l    clc_repeat_skip            *$d8 clc_repeat_skip
  19477.     dc.l    clc_repeat_skip2        *$d9 clc_repeat_skip2
  19478.     dc.l    clc_pmod_deepen            *$da pmod deepen
  19479.     dc.l    clc_arcc_deepen            *$db arcc deepen
  19480.     dc.l    clc_vseq_deepen            *$dc vseq deepen
  19481.     dc.l    clc_agogik_deepen        *$dd agogik deepen
  19482.     dc.l    clc_timbre_split        *$de timbre split
  19483.     dc.l    clc_vseq_wf            *$df vseq wf
  19484.     dc.l    clc_bend_@b            *$e0 bend @b
  19485.     dc.l    clc_bend_@k            *$e1 bend @k
  19486.     dc.l    clc_pmod8            *$e2 pmod8
  19487.     dc.l    clc_pmod_speed8            *$e3 pmod speed8
  19488.     dc.l    clc_pmod_delay8            *$e4 pmod delay8
  19489.     dc.l    clc_arcc8            *$e5 arcc8
  19490.     dc.l    clc_arcc_speed8            *$e6 arcc speed8
  19491.     dc.l    clc_arcc_delay8            *$e7 arcc delay8
  19492.     dc.l    clc_aftertouch            *$e8 after touch
  19493.     dc.l    clc_aftc_delay8            *$e9 aftc delay8
  19494.     dc.l    clc_vseq8            *$ea vseq8
  19495.     dc.l    clc_vseq_speed8            *$eb vseq speed8
  19496.     dc.l    clc_vseq_delay8            *$ec vseq delay8
  19497.     dc.l    clc_agogik8            *$ed agogik8
  19498.     dc.l    clc_agogik_speed8        *$ee agogik speed8
  19499.     dc.l    clc_agogik_delay8        *$ef agogik delay8
  19500.     dc.l    clc_effect_ctrl            *$f0 effect ctrl
  19501.     dc.l    clc_poke            *$f1 poke
  19502.     dc.l    clc_rltv_poke            *$f2 rltv poke
  19503.     dc.l    clc_exclusive            *$f3 roland_exclusive
  19504.     dc.l    clc_midi_transmission        *$f4 midi transmission
  19505.     dc.l    clc_loop            *$f5 loop
  19506.     dc.l    clc_auto_portament        *$f6 オートポルタメント
  19507.     dc.l    clc_asgn_arcc            *$f7 ARCCアサイン
  19508.     dc.l    clc_event            *$f8 イベント制御
  19509.     dc.l    clc_return            *$f9 return
  19510.     dc.l    1,1                *$fa~$fb all 1 byte
  19511.     dc.l    clc_fine            *$fc fine
  19512.     dc.l    1                *$fd all 1 byte
  19513.     dc.l    clc_msln            *$fe measure
  19514.     dc.l    1                *$ff
  19515.  
  19516. case_clcky:                *通常音符
  19517.     add.w    d0,d4            *calc check sum
  19518.     bsr    get_vlv            *skip step
  19519.     mulu    clc_trkfrq(pc),d1
  19520.     add.l    d1,d5            *st measure
  19521.     add.l    d1,d7            *tr total
  19522.     tst.b    clc_phase-work(a6)
  19523.     ble    @f            *minus or zero
  19524.     bsr    calc_play_time
  19525. @@:
  19526.     bsr    get_vlv            *skip gate
  19527.     move.b    (a4)+,d1
  19528.     ext.w    d1
  19529.     add.w    d1,d4            *skip velo(calc checksum)
  19530.     bra    getzmdlp
  19531.  
  19532. get_vlv:                *可変長データ
  19533.     * > d1.l=value
  19534.     * x d1
  19535.     moveq.l    #0,d1
  19536.     move.b    (a4)+,d1
  19537.     bpl    @f
  19538.     add.b    d1,d1            *最上位ビット殺す
  19539.     lsl.w    #7,d1
  19540.     move.b    (a4)+,d1
  19541. @@:
  19542.     add.w    d1,d4            *checksum
  19543.     rts
  19544.  
  19545. ope_word:                *ワード長データ
  19546.     * > d1.l=value
  19547.     * x d1
  19548.     move.b    (a4)+,d1
  19549.     lsl.w    #8,d1
  19550.     move.b    (a4)+,d1
  19551.     add.w    d1,d4            *checksum
  19552.     rts
  19553.  
  19554. occupy_compiler:            *コンパイラ占有ファンクション
  19555.     *   cmd=$6d
  19556.     * < d1.l=1    lock Compiler
  19557.     * < d1.l=0    unlock Compiler
  19558.     * < d1.l=-1    ask status
  19559.     * > d0.l    case:d1.l=1,0    d0:以前の占有状態(d1.l=-1のケース参照)
  19560.     * > d0.l    case:d1.l=-1    d0=0:free,    d0.l=1:occupied
  19561.     tst.l    d1
  19562.     bmi    1f
  19563.     beq    @f
  19564.                         *Lock
  19565.     addq.b    #1,occupy_flag_c-work(a6)
  19566.     bra    1f
  19567. @@:                        *Unlock
  19568.     tst.b    occupy_flag_c-work(a6)
  19569.     beq    1f
  19570.     subq.b    #1,occupy_flag_c-work(a6)
  19571. 1:
  19572.     moveq.l    #0,d0
  19573.     move.b    occupy_flag_c(pc),d0
  19574.     rts
  19575.  
  19576. occupy_flag_c:    dc.w    0
  19577. *-----------------------------------------------------------------------------
  19578. _get_mem:
  19579.     addq.l    #3,d2
  19580.     andi.w    #$fffc,d2    *make it long word border
  19581.     move.l    d2,-(sp)
  19582.     DOS    _MALLOC
  19583.     addq.w    #4,sp
  19584.     tst.l    d0
  19585.     bmi    @f
  19586.     move.l    d0,a0
  19587. @@:
  19588.     rts
  19589. get_mem:            *メモリの確保
  19590.     * < d2.l=memory size
  19591.     * < d3.l=employment
  19592.     * > d0.l=memory block address (or error code/ depends on _S_MALLOC)
  19593.     * > d2.l=long word border size
  19594.     * > a0.l=data address
  19595.     * - all
  19596.     bra.s    _get_mem    *常駐時はNOPに
  19597.     Z_MUSIC    #ZM_GET_MEM
  19598.     rts
  19599.  
  19600. _enlarge_mem:            *メモリブロックの拡大縮小
  19601.     movem.l    a1-a2,-(sp)
  19602.     addq.l    #3,d2
  19603.     andi.w    #$fffc,d2    *Make it long word border
  19604.     move.l    a1,a0
  19605.     move.l    d2,-(sp)
  19606.     pea    (a1)
  19607.     DOS    _SETBLOCK
  19608.     addq.w    #8,sp
  19609.     tst.l    d0
  19610.     beq    exit_enlmm    *no error
  19611.     move.l    d2,-(sp)    *SETBLOCK出来ない時は新たにメモリ確保
  19612.     DOS    _MALLOC
  19613.     addq.w    #4,sp
  19614.     tst.l    d0
  19615.     bmi    exit_enlmm    *error
  19616.     move.l    d0,a0
  19617.     move.l    a0,a2
  19618.     pea    (a1)
  19619.     move.l    d2,d0
  19620. @@:                *旧メモリ内容を新メモリエリアへ複写
  19621.     move.l    (a1)+,(a2)+
  19622.     subq.l    #4,d0
  19623.     bhi    @b
  19624.     DOS    _MFREE        *メモリ開放
  19625.     addq.w    #4,sp
  19626. exit_enlmm:
  19627.     movem.l    (sp)+,a1-a2
  19628.     rts
  19629.  
  19630. enlarge_mem:            *メモリブロックの拡大縮小
  19631.     * < d2.l=new memory size
  19632.     * < a1.l=now address
  19633.     * > d0.l=address (0:done it, error/ depends on _S_MALLOC)
  19634.     * > d2.l=long word border size
  19635.     * > a0.l=address
  19636.     * - all
  19637.     bra.s    _enlarge_mem        *常駐時はNOPに
  19638.     Z_MUSIC    #ZM_ENLARGE_MEM
  19639.     rts
  19640.  
  19641. _free_mem:
  19642.     pea    (a1)
  19643.     DOS    _MFREE
  19644.     addq.w    #4,sp
  19645.     tst.l    d0
  19646.     bne    @f        *case error
  19647.     moveq.l    #0,d0
  19648. @@:
  19649.     rts
  19650.  
  19651. free_mem:            *メモリブロックの解放
  19652.     * < a1.l=data address
  19653.     * > d0.l=0 no error
  19654.     * - a1
  19655.     bra.s    _free_mem        *常駐時はNOPに
  19656.     Z_MUSIC    #ZM_FREE_MEM
  19657.     rts
  19658. *-----------------------------------------------------------------------------
  19659. set_err_code_for_compile:
  19660.     tst.l    pmr_addr-work(a6)
  19661.     beq    @f
  19662.     move.l    line_number(pc),-(sp)
  19663.     jbsr    get_true_ln            *マクロ変換によってずれた行番号を補正する
  19664.     bsr    @f
  19665.     move.l    (sp)+,line_number-work(a6)
  19666.     rts
  19667. @@:
  19668.     move.l    d0,-(sp)
  19669.     move.l    include_depth(pc),d0
  19670.     beq    @f
  19671.     move.l    zms_file_id(pc),d0        *filename[n]
  19672. @@:
  19673.     move.l    d0,-(sp)
  19674.     move.l    line_number(pc),d0        *追加エラー情報
  19675.     move.l    d0,-(sp)
  19676.     move.l    line_ptr(pc),d0
  19677.     sub.l    line_locate(pc),d0
  19678.     move.l    d0,-(sp)
  19679.     move.l    12(sp),d0
  19680.     cmp.l    err_cache(pc),d0
  19681.     bne    @f
  19682.     move.l    8(sp),d0
  19683.     cmp.l    err_cache+4(pc),d0
  19684.     bne    @f
  19685.     move.l    4(sp),d0
  19686.     cmp.l    err_cache+8(pc),d0
  19687.     bne    @f
  19688.     move.l    (sp),d0
  19689.     cmp.l    err_cache+12(pc),d0
  19690.     bne    @f
  19691.     lea    16(sp),sp
  19692.     moveq.l    #-1,d0                *Cached mark
  19693.     rts
  19694. @@:
  19695.     move.l    (sp)+,err_cache+12-work(a6)
  19696.     move.l    (sp)+,err_cache+8-work(a6)
  19697.     move.l    (sp)+,err_cache+4-work(a6)
  19698.     move.l    (sp)+,d0
  19699.     move.l    d0,err_cache+0-work(a6)
  19700.     cmpi.b    #ZM_COMPILER,zmc_call-work(a6)
  19701.     bne    set_err_code
  19702.     tst.w    compile_option+2-work(a6)    *エラーテーブル作成要求有るか
  19703.     bpl    do_exit_sec            *作成しない場合は帰還する
  19704.     bsr    set_err_code
  19705.     move.l    err_cache+4-work(a6),d0
  19706.     bsr    set_err_code
  19707.     move.l    err_cache+8-work(a6),d0
  19708.     bsr    set_err_code
  19709.     move.l    err_cache+12-work(a6),d0
  19710.     bsr    set_err_code
  19711.     moveq.l    #0,d0                *NORMAL END MARK
  19712.     rts
  19713.  
  19714. set_err_code:                    *エラーコードのストック
  19715.     * < d0.l=error code
  19716.     * - all
  19717. reglist    reg    d0-d5/a0-a1
  19718.     movem.l    reglist,-(sp)
  19719.     move.l    d0,d4            *main info
  19720.     move.l    err_stock_now(pc),d1
  19721.     move.l    err_stock_addr(pc),d0
  19722.     bne    case_erstk_enlg
  19723.     move.l    #256,d2            *初期値は256バイト
  19724.     move.l    #ID_ERROR,d3
  19725.     bsr    get_mem
  19726.     tst.l    d0
  19727.     bmi    exit_sec
  19728.     move.l    d2,err_stock_size-work(a6)
  19729.     move.l    a0,err_stock_addr-work(a6)
  19730.     clr.l    err_stock_now-work(a6)
  19731.     bra    store_ercd_
  19732. store_ercd:
  19733.     move.l    d0,a0
  19734.     add.l    d1,a0
  19735. store_ercd_:
  19736.     move.l    d4,(a0)+        *エラー情報格納
  19737.     sub.l    err_stock_addr(pc),a0
  19738.     move.l    a0,err_stock_now-work(a6)
  19739. exit_sec:
  19740.     movem.l    (sp)+,reglist
  19741. do_exit_sec:
  19742.     rts
  19743. case_erstk_enlg:            *メモリ領域拡大の場合
  19744.     cmp.l    err_stock_size(pc),d1    *d1.l=現在の書き込み目的オフセット
  19745.     bcs    store_ercd
  19746.     move.l    d0,a1
  19747.     move.l    err_stock_size(pc),d2
  19748.     add.l    #256,d2            *もう256バイト確保
  19749.     move.l    d2,err_stock_size-work(a6)
  19750.     bsr    enlarge_mem
  19751.     tst.l    d0
  19752.     bmi    exit_sec        *out_of_memoryケース
  19753.     move.l    a0,err_stock_addr-work(a6)
  19754.     add.l    d1,a0
  19755.     bra    store_ercd_
  19756. *-----------------------------------------------------------------------------
  19757. t_out_of_memory_clc:        *メモリ不足(CALC_TOTAL)
  19758.     move.l    #ZM_CALC_TOTAL*65536+OUT_OF_MEMORY,d0
  19759.     bra    @f
  19760. *-----------------------------------------------------------------------------
  19761. t_illegal_version_number_clc:    *メモリ不足(CALC_TOTAL)
  19762.     move.l    #ZM_CALC_TOTAL*65536+ILLEGAL_VERSION_NUMBER,d0
  19763.     bra    @f
  19764. *-----------------------------------------------------------------------------
  19765. t_unidentified_file_clc:    *ZMUSICシステムのファイルではない
  19766.     move.l    #ZM_CALC_TOTAL*65536+UNIDENTIFIED_FILE,d0
  19767. @@:
  19768.     moveq.l    #0,d0
  19769.     bsr    set_err_code                *dummy
  19770.     bsr    set_err_code                *dummy
  19771.     bsr    set_err_code                *dummy
  19772.     bra    @f
  19773. *-----------------------------------------------------------------------------
  19774. t_undefined_zmd_code_clc:        *未定義のZMDである
  19775.     move.l    #ZM_CALC_TOTAL*65536+UNDEFINED_ZMD_CODE,d0
  19776.     bsr    set_err_code
  19777.     move.l    sv_filename(pc),d0    *ファイルネーム
  19778.     bsr    set_err_code
  19779.     move.l    a4,d0
  19780.     subq.l    #1,d0
  19781.     sub.l    zmd_top(pc),d0        *未定義ZMDの存在するオフセットアドレス
  19782.     bsr    set_err_code
  19783.     moveq.l    #0,d0
  19784.     move.b    -1(a4),d0        *ZMD内容
  19785.     bsr    set_err_code
  19786. @@:
  19787.     addq.l    #1,n_of_err-work(a6)    *inc error count
  19788.     move.l    sp_buf(pc),sp
  19789.     bsr    rel_clctmpmem
  19790.     move.l    n_of_err-work(a6),d0
  19791.     add.l    n_of_warn-work(a6),d0
  19792.     move.l    err_stock_addr-work(a6),a0
  19793.     rts
  19794. *-----------------------------------------------------------------------------
  19795.     if    (debug.and.1)
  19796. debug2:                *デバグ用ルーチン(レジスタ値を表示/割り込み対応)
  19797.     move.w    sr,db_work2    *save sr    (サブルーチン_get_hex32が必要)
  19798.     ori.w    #$700,sr    *mask int
  19799.     movem.l    d0-d7/a0-a7,db_work
  19800.  
  19801.     moveq.l    #%0011,d1
  19802.     IOCS    _B_COLOR
  19803.  
  19804.     lea    str__(pc),a1
  19805.  
  19806.     move.w    #$0d0a,(a1)+    *!
  19807.     move.w    #$0d0a,(a1)+    *!
  19808.     move.w    #$0d0a,(a1)+
  19809.  
  19810.     moveq.l    #8-1,d7
  19811.     lea    db_work(pc),a6
  19812. dbg2_lp01:
  19813.     move.l    (a6)+,d0
  19814.     bsr    _get_hex32
  19815.     addq.w    #8,a1
  19816.     cmpi.b    #4,d7
  19817.     bne    @f
  19818.     move.b    #' ',(a1)+
  19819. @@:
  19820.     move.b    #' ',(a1)+
  19821.     dbra    d7,dbg2_lp01
  19822.  
  19823.     move.b    #$0d,(a1)+
  19824.     move.b    #$0a,(a1)+
  19825.  
  19826.     moveq.l    #8-1,d7
  19827. dbg2_lp02:
  19828.     move.l    (a6)+,d0
  19829.     bsr    _get_hex32
  19830.     addq.w    #8,a1
  19831.     cmpi.b    #4,d7
  19832.     bne    @f
  19833.     move.b    #' ',(a1)+
  19834. @@:
  19835.     move.b    #' ',(a1)+
  19836.     dbra    d7,dbg2_lp02
  19837.  
  19838.     move.l    (a7),d0
  19839.     bsr    _get_hex32
  19840.     addq.w    #8,a1
  19841. *    move.b    #$0d,(a1)+
  19842. *    move.b    #$0a,(a1)+
  19843.     clr.b    (a1)+
  19844.     lea    str__(pc),a1
  19845.     IOCS    _B_PRINT
  19846. *@@:
  19847. *    btst.b    #5,$806.w
  19848. *    bne    @b
  19849.  
  19850.     movem.l    db_work(pc),d0-d7/a0-a7
  19851.     move.w    db_work2(pc),sr    *get back sr
  19852.     rts
  19853.  
  19854. _get_hex32:            *値→16進数文字列(4bytes)
  19855.     * < d0=data value
  19856.     * < a1=格納したいアドレス
  19857.     * > (a1)=ascii numbers
  19858.     * - all
  19859.     movem.l    d0-d1/d4/a1,-(sp)
  19860.     addq.w    #8,a1
  19861.     clr.b    (a1)
  19862.     moveq.l    #8-1,d4
  19863. _gh_lp32:
  19864.     move.b    d0,d1
  19865.     andi.b    #$0f,d1
  19866.     add.b    #$30,d1
  19867.     cmpi.b    #'9',d1
  19868.     bls    _its_hex32
  19869.     addq.b    #7,d1
  19870. _its_hex32:
  19871.     move.b    d1,-(a1)
  19872.     lsr.l    #4,d0
  19873.     dbra    d4,_gh_lp32
  19874.     movem.l    (sp)+,d0-d1/d4/a1
  19875.     rts
  19876.         *デバッグ用ワーク
  19877.     .even
  19878. str__:        ds.b    96*2
  19879.         dc.b    'REGI'
  19880. db_work:    dcb.l    16,0        *for debug
  19881. db_work2:    dc.l    0
  19882. tad:        dc.l    $e40000
  19883.  
  19884. debug1:
  19885.     move.w    sr,-(sp)
  19886.     move.l    a0,-(sp)
  19887.     move.l    tad(pc),a0
  19888.     move.l    d0,(a0)+
  19889.     move.l    a0,tad
  19890.     move.l    (sp)+,a0
  19891.     move.w    (sp)+,sr
  19892. @@:
  19893.     rts
  19894.  
  19895.     endif
  19896.  
  19897. play_beep:                *BEEP音を鳴らす
  19898.     move.w    sr,-(sp)
  19899.     ori.w    #$700,sr
  19900.     move.l    d0,-(sp)
  19901.     move.w    #$07,-(sp)
  19902.     clr.w    -(sp)
  19903.     DOS    _CONCTRL
  19904.     addq.w    #4,sp
  19905.     move.l    (sp)+,d0
  19906.     move.w    (sp)+,sr
  19907.     rts
  19908.  
  19909. mk_capital:            *小文字→大文字(英字以外の場合はそのままthrough out)
  19910.     * < d0.b=letter chr
  19911.     cmpi.b    #'a',d0
  19912.     bcs    exit_mkcptl
  19913.     cmpi.b    #'z',d0
  19914.     bhi    exit_mkcptl
  19915.     andi.w    #$df,d0        *わざと.w
  19916. exit_mkcptl:
  19917.     rts
  19918.  
  19919. kakuchoshi:            *拡張子を設定
  19920.     * < a0=filename address
  19921.     * < a1=拡張子アドレス
  19922.     * X a0
  19923.     bsr    skip_peri
  19924.     moveq.l    #91-1,d0
  19925. kkchs_lp:
  19926.     move.b    (a0)+,d0
  19927.     beq    do_kkchs
  19928.     cmpi.b    #'.',d0
  19929.     beq    find_period
  19930.     dbra    d0,kkchs_lp
  19931. do_kkchs:
  19932.     subq.l    #1,a0
  19933.     move.b    #'.',(a0)+
  19934.     move.b    (a1)+,(a0)+
  19935.     move.b    (a1)+,(a0)+
  19936.     move.b    (a1)+,(a0)+
  19937.     clr.b    (a0)
  19938.     rts
  19939. find_period:
  19940.     cmpi.b    #' ',(a0)
  19941.     bls    do_kkchs    *'.'はあっても拡張子がないケース
  19942.     rts
  19943.  
  19944. skip_peri:
  19945.     * < a0.l=filename addr
  19946. @@:
  19947.     cmpi.b    #'.',(a0)
  19948.     bne    @f
  19949.     addq.w    #1,a0
  19950.     bra    @b
  19951. @@:
  19952.     rts
  19953.  
  19954. cache_flush:                *キャッシュのフラッシュ
  19955.     movem.l    d0-d1,-(sp)
  19956.     moveq.l    #3,d1
  19957.     IOCS    _SYS_STAT
  19958.     movem.l    (sp)+,d0-d1
  19959.     rts
  19960.  
  19961.     .include    fopen.has
  19962.  
  19963. get_filedate:
  19964.     clr.l    -(sp)
  19965.     move.w    d5,-(sp)
  19966.     DOS    _FILEDATE
  19967.     addq.w    #6,sp
  19968.     rts
  19969.  
  19970.     .include    zcwork.s
  19971.     .even
  19972.  
  19973. dev_init:                *デバイスドライバとしての初期化
  19974.     movem.l    d1/a1/a6,-(sp)
  19975.     lea    work(pc),a6
  19976.     lea    cannot_reg(pc),a1
  19977.     bsr    bil_prta1
  19978.     movem.l    (sp)+,d1/a1/a6
  19979.     jmp    not_com
  19980.  
  19981. exec:                *コマンドラインから実行した時
  19982.     lea    work(pc),a6
  19983.     clr.l    -(sp)
  19984.     DOS    _SUPER            *スーパーバイザーへ
  19985.     addq.w    #4,sp
  19986.     move.l    d0,ssp-work(a6)
  19987.     move.l    sp,_sp_buf-work(a6)
  19988.  
  19989.     move.l    a0,a0work-work(a6)
  19990.     move.l    a1,a1work-work(a6)
  19991.  
  19992.     tst.b    $0cbc.w                *MPUが68000ならキャッシュフラッシュ必要無し
  19993.     bne    @f
  19994.     move.w    #RTS,cache_flush-work(a6)
  19995. @@
  19996.     lea    $10(a0),a0        *メモリブロックの変更
  19997.     suba.l    a0,a1
  19998.     pea    (a1)
  19999.     pea    (a0)
  20000.     DOS    _SETBLOCK
  20001.     addq.w    #8,sp
  20002.  
  20003.     bsr    get_compile_work    *ワークを確保
  20004.  
  20005.     movea.l    a2,a4
  20006.     addq.w    #1,a4            *skip length of cmd line
  20007. *    move.l    a4,-(sp)
  20008.  
  20009.     DOS    _VERNUM
  20010.     cmpi.w    #$0300,d0
  20011.     bcs    Human_ver_err
  20012.     bsr    chk_drv            *CHECK ZMUSIC
  20013.     bmi    @f
  20014.     cmpi.w    #$2500,(a1)        *version check(2.5より大きくないと駄目)
  20015.     scc    zmusic_stat-work(a6)
  20016. @@:                    *スイッチ処理
  20017.     pea    zmc_opt(pc)
  20018.     bsr    search_env
  20019.     addq.w    #4,sp
  20020.     tst.l    d0
  20021.     beq    @f
  20022.     move.l    a4,-(sp)
  20023.     move.l    d0,a4
  20024.     bsr    chk_optsw
  20025.     move.l    (sp)+,a4
  20026. @@:
  20027.     clr.b    zmc_opt-work(a6)
  20028.     bsr    chk_optsw
  20029.  
  20030.     bsr    set_patch
  20031.     bsr    set_vect
  20032.     bne    register_unsuccessful    *(登録失敗)
  20033.     bsr    prt_keep_info
  20034.     bsr    set_dev_name
  20035.     bmi    unknown_err
  20036.  
  20037.     move.l    ssp(pc),a1
  20038.     IOCS    _B_SUPER
  20039.  
  20040.     clr.w    -(sp)
  20041.     move.l    #dev_init-begin_of_prog,-(sp)
  20042.     DOS    _KEEPPR            *常駐終了
  20043.  
  20044. register_unsuccessful:            *常駐失敗
  20045.     lea    occupy_unsuccessful_mes(pc),a1
  20046.     bra    err_exit
  20047.  
  20048. unknown_err:
  20049.     lea    unknown_mes(pc),a1
  20050. err_exit:
  20051.     bsr    prt_title
  20052.     bsr    bil_prta1
  20053. err_exit0:
  20054.     move.l    ssp(pc),a1
  20055.     IOCS    _B_SUPER    *ユーザーモードへ戻る
  20056.  
  20057.     move.w    #1,-(sp)
  20058.     DOS    _EXIT2
  20059.  
  20060. title_mes:            *使い捨てのワーク群(後にグローバルワークとして使用される)
  20061.     dc.b    'Z-MUSIC MML COMPILER '
  20062.     dc.b    $F3,'I',$F3,'N',$F3,'T',$F3,'E',$F3,'G',$F3,'R',$F3,'A',$F3,'L '
  20063.     dc.b    $F3,'V',$F3,'E',$F3,'R',$F3,'S',$F3,'I',$F3,'O',$F3,'N'
  20064.     version
  20065.     TEST
  20066.     dc.b    ' (C) 1995,97 '
  20067.     dc.b    'ZENJI SOFT',13,10,0
  20068. linked_mes:    dc.b    'Z-MUSIC MML COMPILER has succeeded in linking with Z-MUSIC PERFORMANCE MANAGER.',13,10,0
  20069. linked_mes_j:    dc.b    'Z-MUSICコンパイラをZ-MUSIC演奏マネージャとリンクしました',13,10,0
  20070. out_mem_mes:    dc.b    'Out of memory.',13,10,0
  20071. out_mem_mes_j:    dc.b    'メモリが不足しています',13,10,0
  20072. os_old_mes:    dc.b    "Z-MUSIC runs on Human68k ver.3.00 and over.",13,10,0
  20073. os_old_mes_j:    dc.b    "Z-MUSICはバージョン3.0以上のHuman68kで動作します",13,10,0
  20074. kakuho_mes:    dc.b    'kByte(s)',0
  20075. not_kep_mes:    dc.b    'Z-MUSIC MML COMPILER is not kept in the system.',13,10,0
  20076. not_kep_mes_j:    dc.b    'Z-MUSIC MML コンパイラは常駐していません',13,10,0
  20077. rls_er_mes:    dc.b    'Z-MUSIC MML COMPILER is unable to release.',13,10,0
  20078. rls_er_mes_j:    dc.b    'Z-MUSIC MML コンパイラの常駐解除はできません',13,10,0
  20079. ocp_er_mes:    dc.b    'Z-MUSIC MML COMPILER is occupied by some other application.',13,10,0
  20080. ocp_er_mes_j:    dc.b    'Z-MUSIC MML コンパイラは他のアプリケーションに占有されています',13,10,0
  20081. ver_er_mes:    dc.b    'Illegal version number. Unable to release.',13,10,0
  20082. ver_er_mes_j:    dc.b    'バージョンが異なるため解除は出来ません',13,10,0
  20083. nozm_er_mes:    dc.b    'Z-MUSIC PERFORMANCE MANAGER has to be included previously.',13,10,0
  20084. nozm_er_mes_j:    dc.b    'Z-MUSIC演奏マネージャが先に常駐していなければなりません',13,10,0
  20085. occupy_unsuccessful_mes:
  20086.         dc.b    'Fail in registering Z-MUSIC MML COMPILER.',13,10,0
  20087.         dc.b    'Z-MUSIC MML コンパイラの登録に失敗しました',13,10,0
  20088. unknown_mes:    dc.b    'Unknown error.',13,10,0
  20089. unknown_mes_j:    dc.b    '原因不明のエラーが発生しました',13,10,0
  20090. create_er_mes:        dc.b    ' … File cannot be created.',13,10,0
  20091. create_er_mes_j:    dc.b    ' … ファイルが作成できません',13,10,0
  20092. write_er_mes:    dc.b    ' … Write error.',13,10,0
  20093. write_er_mes_j:    dc.b    ' … 書き込みに失敗しました',13,10,0
  20094. read_er_mes:    dc.b    ' … Unable to read.',13,10,0
  20095. read_er_mes_j:    dc.b    ' … 読み出せません',13,10,0
  20096. cannot_reg:    dc.b    13,10,'ZMC.X cannot be registered from CONFIG.SYS.',13,10,0
  20097. cannot_reg_j:    dc.b    13,10,'ZMC.XはCONFIG.SYSから登録することは出来ません',13,10,0
  20098.  
  20099. how_many_err:    dc.b    ' ERROR(S)',13,10,0
  20100. how_many_err_j:    dc.b    '個のエラーが発生しました',13,10,0
  20101. *b_clr_st:    dc.b    $1b,'[J',0
  20102. *b_era_st:    dc.b    $1b,'[2K',0
  20103. no_err_mes:    dc.b    'Operations are all set.',13,10
  20104.         dc.b    'A ',$1b,'[37m','♪SOUND',$1b,'[m mind in a '
  20105.         dc.b    $1b,'[37mSOUND',$1b,'[m',' body.',13,10,0
  20106. no_err_mes_j:    dc.b    'コンパイル完了',13,10,0
  20107. help_mes:    dc.b    '< USAGE >'
  20108.         dc.b    ' ZMC.X [Optional Switches]',13,10
  20109.         dc.b    '< OPTIONAL SWITCHES >',13,10
  20110.         dc.b    '-? or H        Display the list of optional switches.',13,10
  20111.         dc.b    '-C<filename1>  Compile the music source file(filename1)',13,10
  20112.         dc.b    '  [,filename2] into the object file(filename2).',13,10
  20113.         dc.b    '-E<n>          Compiling operation will be terminated if the number of errors reaches n.',13,10
  20114.         dc.b    '-J             Messages will be displayed in Japanese.',13,10
  20115.         dc.b    '-L             Link with Z-MUSIC PERFORMANCE MANAGER.',13,10
  20116.         dc.b    '-R             Unlink and release Z-MUSIC MML COMPILER.',13,10
  20117.         dc.b    '-T             Restrain the detection of error location.',13,10
  20118.         dc.b    '-W             Restrain the output of warning messages.',13,10
  20119.         dc.b    0
  20120. help_mes_j:    dc.b    '< 使用方法 >'
  20121.         dc.b    ' ZMC.X [オプションスイッチ]',13,10
  20122.         dc.b    '< オプションスイッチ一覧 >',13,10
  20123.         dc.b    '-? or H        ヘルプの表示',13,10
  20124.         dc.b    '-C<filename1>  ソースファイル(filename1)をコンパイルし',13,10
  20125.         dc.b    '  [,filename2] オブジェクトファイル(filename2)を生成する',13,10
  20126.         dc.b    '-E<n>          エラーの個数がn個になったらコンパイル処理を中断する',13,10
  20127.         dc.b    '-J             日本語メッセージ表示',13,10
  20128.         dc.b    '-L             Z-MUSIC演奏マネージャとリンクする',13,10
  20129.         dc.b    '-R             Z-MUSIC MML コンパイラの常駐を解除する',13,10
  20130.         dc.b    '-T             エラー箇所の検出を省略する',13,10
  20131.         dc.b    '-W             ウォーニングメッセージの出力を抑制する',13,10
  20132.         dc.b    0
  20133. zmc_opt:    dc.b    'zmc_opt',0
  20134.     .even
  20135.  
  20136. bil_prta1:                *日本語対応
  20137.     tst.b    errmes_lang-work(a6)    *0:英語か 1:日本語か
  20138.     beq    prta1
  20139. @@:                    *次のメッセージをゲット
  20140.     tst.b    (a1)+
  20141.     bne    @b
  20142. prta1:
  20143.     move.w    #2,-(sp)
  20144.     pea    (a1)
  20145.     DOS    _FPUTS
  20146.     addq.w    #6,sp
  20147.     rts
  20148.  
  20149. prta1_:
  20150.     move.l    d0,-(sp)
  20151.     pea    (a1)
  20152.     DOS    _PRINT
  20153.     addq.w    #4,sp
  20154.     move.l    (sp)+,d0
  20155.     rts
  20156.  
  20157. chk_optsw:                *スイッチ処理
  20158.     * < cmd_or_dev  0:device / $ff:command
  20159.     tst.b    (a4)
  20160.     beq    prt_help
  20161. chk_optsw_lp:
  20162.     move.b    (a4)+,d0
  20163.     beq    no_more?
  20164.     cmpi.b    #' ',d0
  20165.     beq    chk_optsw_lp
  20166.     cmpi.b    #'-',d0        *その他スイッチ処理へ
  20167.     beq    other_sw
  20168.     cmpi.b    #'/',d0
  20169.     beq    other_sw
  20170.     subq.w    #1,a4
  20171.     bra    compile_mode
  20172.  
  20173. no_more?:            *もうこれ以上スイッチは無しか
  20174.     tst.b    zmc_opt-work(a6)
  20175.     beq    @f        *コマンドラインからならもうスイッチはあり得ない
  20176.     rts
  20177. @@:
  20178.     tst.b    get_src_fn-work(a6)    *ファイル名取得したなら
  20179.     bne    compile_mode        *コンパイル処理へ
  20180.     tst.b    link_switch-work(a6)
  20181.     beq    prt_help
  20182.     rts
  20183.  
  20184. other_sw:            *その他のスイッチ
  20185.     move.b    (a4)+,d0
  20186.     beq    no_more?
  20187.     cmpi.b    #'?',d0        *diplay help message
  20188.     beq    prt_help
  20189.     cmpi.b    #'#',d0        *絶対アドレス指定TOTAL
  20190.     beq    absolute_calc
  20191.     cmpi.b    #'!',d0        *絶対アドレス指定COMPILE
  20192.     beq    absolute_compile
  20193.     cmpi.b    #'2',d0
  20194.     beq    set_v2_mode
  20195.     bsr    mk_capital    
  20196.     cmpi.b    #'C',d0        *compile
  20197.     beq    setting_for_compile
  20198.     cmpi.b    #'D',d0        *display
  20199.     beq    display_line_mode
  20200.     cmpi.b    #'E',d0        *set max err num.
  20201.     beq    set_err_num
  20202.     cmpi.b    #'G',d0        *no display mode
  20203.     beq    set_disp_mode
  20204.     cmpi.b    #'H',d0        *diplay help message
  20205.     beq    prt_help
  20206.     cmpi.b    #'J',d0        *エラーメッセージの言語
  20207.     beq    set_err_lang
  20208.     cmpi.b    #'L',d0        *link
  20209.     beq    link_mode
  20210.     cmpi.b    #'R',d0        *解除
  20211.     beq    release
  20212.     cmpi.b    #'T',d0        *エラー箇所レポート機能オフ
  20213.     beq    no_report_mode
  20214.     cmpi.b    #'W',d0        *Warning検出出力オフ
  20215.     beq    no_warn_mode
  20216.     bra    prt_help
  20217.  
  20218. display_line_mode:
  20219.     patch_w2    BSR,crl_patch,disp_line
  20220.     bsr    cache_flush
  20221.     bra    chk_optsw_lp
  20222.  
  20223. set_err_num:                *エラーの個数がこの値を超えたらコンパイル中断
  20224.     clr.b    max_err_num-work(a6)    *デフォルト=0(max)
  20225.     moveq.l    #-1,d4            *dummy end of cmd line
  20226.     jsr    chk_num-work(a6)
  20227.     bmi    chk_optsw_lp
  20228.     jsr    get_num-work(a6)
  20229.     cmpi.l    #127,d1
  20230.     bhi    chk_optsw_lp
  20231.     move.b    d1,max_err_num-work(a6)
  20232.     bra    chk_optsw_lp
  20233.  
  20234. set_err_lang:                *エラーメッセージの言語選択
  20235.     move.b    #1,errmes_lang-work(a6)    *1:Japanese
  20236.     bra    chk_optsw_lp
  20237.  
  20238. set_v2_mode:
  20239.     st.b    v2_mode-work(a6)
  20240.     bra    chk_optsw_lp
  20241.  
  20242. set_disp_mode:                *表示モード
  20243.     clr.b    disp_mode-work(a6)
  20244.     move.l    #$7000_4e75,d0            *moveq.l #0,d0
  20245.                         *rts
  20246.     move.l    d0,prt_title-work(a6)        *タイトル
  20247.     move.w    d0,prt_keep_info-work(a6)    *常駐ステータス
  20248.     move.w    d0,release_mes-work(a6)        *解除
  20249.     bsr    cache_flush
  20250.     bra    chk_optsw_lp
  20251.  
  20252. no_report_mode:
  20253.     move.w    #RTS,scan_line_number-work(a6)
  20254.     bsr    cache_flush
  20255.     bra    chk_optsw_lp
  20256.  
  20257. no_warn_mode:
  20258.     patch_w    BRA,m_warn_code_exit,mwce_exit
  20259.     bsr    cache_flush
  20260.     bra    chk_optsw_lp
  20261.  
  20262. link_mode:                *常駐する
  20263.     tst.b    zmusic_stat-work(a6)    *ZMUSICが常駐していないのならば無理
  20264.     beq    no_zmusic_err
  20265.     tas    link_switch-work(a6)
  20266.     moveq.l    #0,d1
  20267.     Z_MUSIC    #ZM_INIT
  20268.     rts
  20269.  
  20270. absolute_calc:                *絶対アドレストータルタイム計算
  20271.     moveq.l    #-1,d4            *dummy end of cmd line
  20272.     jsr    chk_num-work(a6)
  20273.     bmi    chk_optsw_lp
  20274.     jsr    get_num-work(a6)
  20275.     move.l    d1,src_address-work(a6)        *address
  20276.  
  20277.     jsr    skip_sep-work(a6)
  20278.  
  20279.     jsr    chk_num-work(a6)
  20280.     bmi    chk_optsw_lp
  20281.     jsr    get_num-work(a6)
  20282.     move.l    d1,src_size-work(a6)        *size
  20283.  
  20284.     jsr    skip_sep-work(a6)
  20285.  
  20286.     move.b    #1,compile_type-work(a6)    *アドレスモードで
  20287.     st.b    get_src_fn-work(a6)        *ファイル名取ったとみなす
  20288.     move.l    sv_filename(pc),a0
  20289.     clr.b    (a0)
  20290.     move.l    sr_filename(pc),a0
  20291.     clr.b    (a0)
  20292.     bra    chk_optsw_lp            *!
  20293. *    pea    chk_optsw_lp(pc)
  20294. *    bra    get_dest_name
  20295.  
  20296. absolute_compile:            *絶対アドレスコンパイル
  20297.     moveq.l    #-1,d4            *dummy end of cmd line
  20298.     jsr    chk_num-work(a6)
  20299.     bmi    chk_optsw_lp
  20300.     jsr    get_num-work(a6)
  20301.     move.l    d1,src_address-work(a6)        *address
  20302.  
  20303.     jsr    skip_sep-work(a6)
  20304.  
  20305.     jsr    chk_num-work(a6)
  20306.     bmi    chk_optsw_lp
  20307.     jsr    get_num-work(a6)
  20308.     move.l    d1,src_size-work(a6)        *size
  20309.  
  20310.     jsr    skip_sep-work(a6)
  20311.  
  20312.     st.b    compile_type-work(a6)    *アドレスモードで
  20313. *    st.b    get_src_fn-work(a6)    *ファイル名取ったとみなす
  20314. *    pea    chk_optsw_lp(pc)
  20315. *    bra    get_dest_name
  20316.  
  20317. setting_for_compile:            *コンパイルに向けてのパラメータ設定
  20318.     pea    chk_optsw_lp(pc)
  20319.  
  20320. get_src_zmd_name:
  20321.     tas.b    get_src_fn-work(a6)
  20322.     bne    exit_gszn
  20323.     moveq.l    #-1,d4            *dummy end of cmd line
  20324.     jsr    skip_spc-work(a6)
  20325.     move.l    sr_filename(pc),a0
  20326.     jsr    copy_fn            *get source file name
  20327.     move.l    sr_filename(pc),a0
  20328.     lea    ZMS(pc),a1
  20329.     bsr    kakuchoshi
  20330.     jsr    skip_sep-work(a6)
  20331.     move.b    (a4),d0            *何かコマンドラインに残っているか
  20332.     beq    mk_default_fn        *デフォルトのファイルネームを持ってくる
  20333.     cmpi.b    #'-',d0            *出力ファイルネームではなくて、何か別のものだったら
  20334.     beq    exit_gszn        *スイッチ処理ループへ戻る
  20335.     cmpi.b    #'/',d0
  20336.     beq    exit_gszn
  20337. get_dest_name:
  20338.     move.l    sv_filename(pc),a0
  20339.     jsr    copy_fn            *get destination file name
  20340.     move.l    sv_filename(pc),a0
  20341.     lea    ZMD(pc),a1
  20342.     bsr    kakuchoshi        *拡張子を設定
  20343.     jmp    skip_spc-work(a6)
  20344. exit_gszn:
  20345.     rts                *まだオプション有り
  20346.  
  20347. mk_default_fn:                *デフォルトのファイルネームを作る
  20348.     movem.l    d0-d1/a0-a1,-(sp)
  20349.     move.l    sr_filename(pc),a0
  20350.     bsr    skip_peri
  20351. mdf_:
  20352.     move.l    sv_filename(pc),a1
  20353.     moveq.l    #0,d1
  20354.     tst.b    (a0)
  20355.     bmi    @f
  20356.     cmpi.b    #':',1(a0)
  20357.     bne    @f
  20358.     addq.w    #2,a0
  20359. @@:
  20360. mdf_lp:
  20361.     move.b    (a0)+,d0
  20362.     beq    exit_mdf
  20363.     jsr    chk_kanji-work(a6)    *漢字かどうかチェック
  20364.     bpl    @f
  20365.     move.b    d0,(a1)+    *漢字はペア
  20366.     move.b    (a0)+,(a1)+
  20367.     bra    mdf_lp
  20368. @@:
  20369.     cmpi.b    #'\',d0
  20370.     beq    mdf_
  20371.     cmpi.b    #'.',d0
  20372.     beq    exit_mdf
  20373. *    bsr    mk_capital
  20374. mdf0:
  20375.     move.b    d0,(a1)+
  20376.     bra    mdf_lp
  20377. exit_mdf:
  20378.     move.b    #'.',(a1)+
  20379.     move.b    #'Z',(a1)+
  20380.     move.b    #'M',(a1)+
  20381.     move.b    #'D',(a1)+
  20382.     clr.b    (a1)
  20383.     movem.l    (sp)+,d0-d1/a0-a1
  20384.     rts
  20385.  
  20386. no_zmusic_err:                *ZMUSICが常駐していない
  20387.     bsr    play_beep
  20388.     lea    nozm_er_mes(pc),a1
  20389.     bra    err_exit
  20390.  
  20391. Human_ver_err:
  20392.     jsr    play_beep-work(a6)
  20393.     lea    os_old_mes(pc),a1
  20394.     bra    err_exit
  20395.  
  20396. resigned:
  20397.     bsr    play_beep
  20398.     lea    out_mem_mes(pc),a1
  20399.     bra    err_exit
  20400.  
  20401. set_vect:                *本デバイスドライバを拡張IOCSとして登録
  20402.     * > d0.l≠0ならエラー
  20403.     tst    zmusic_stat-work(a6)
  20404.     beq    prt_help
  20405.  
  20406.     moveq.l    #ZM_COMPILER,d1
  20407.     lea    -1.w,a1            *detect mode
  20408.     Z_MUSIC    #ZM_HOOK_FNC_SERVICE
  20409.     move.l    a0,d0
  20410.     bne    occupied_unsuccessful    *既に占有されていた
  20411.  
  20412.     moveq.l    #ZM_OCCUPY_COMPILER,d1
  20413.     lea    -1.w,a1            *detect mode
  20414.     Z_MUSIC    #ZM_HOOK_FNC_SERVICE
  20415.     move.l    a0,d0
  20416.     bne    occupied_unsuccessful    *既に占有されていた
  20417.  
  20418.     moveq.l    #ZM_CALC_TOTAL,d1
  20419.     lea    -1.w,a1            *detect mode
  20420.     Z_MUSIC    #ZM_HOOK_FNC_SERVICE
  20421.     move.l    a0,d0
  20422.     bne    occupied_unsuccessful    *既に占有されていた
  20423.  
  20424.     lea    release_compiler,a1
  20425.     Z_MUSIC    #ZM_APPLICATION_RELEASER    *解放ルーチンの登録
  20426.     move.l    d0,rel_cmplr_mark-work(a6)
  20427.     move.l    a0,d0
  20428.     beq    occupied_unsuccessful
  20429.  
  20430.     moveq.l    #ZM_COMPILER,d1
  20431.     lea    compiler,a1
  20432.     Z_MUSIC    #ZM_HOOK_FNC_SERVICE    *外部組み込み
  20433.  
  20434.     moveq.l    #ZM_OCCUPY_COMPILER,d1
  20435.     lea    occupy_compiler(pc),a1
  20436.     Z_MUSIC    #ZM_HOOK_FNC_SERVICE    *外部組み込み
  20437.  
  20438.     moveq.l    #ZM_CALC_TOTAL,d1
  20439.     lea    calc_total(pc),a1
  20440.     Z_MUSIC    #ZM_HOOK_FNC_SERVICE    *外部組み込み
  20441. prt_title:                *タイトル表示(-GでRTSに)
  20442.     move.l    a1,-(sp)
  20443.     tst.b    title_mes-work(a6)
  20444.     beq    1f
  20445.     lea.l    title_mes(pc),a1
  20446.     bsr    prta1
  20447.     clr.b    (a1)
  20448. 1:
  20449.     move.l    (sp)+,a1
  20450.     moveq.l    #0,d0            *no problem
  20451.     rts
  20452.  
  20453. occupied_unsuccessful:
  20454.     moveq.l    #-1,d0
  20455.     rts
  20456.  
  20457. set_dev_name:                *コマンドからドライバが実行された場合に
  20458.     lea    $6800,a0        *デバイス名を強制的に登録する
  20459. fdn_lp01:
  20460.     lea    NUL(pc),a2
  20461.     jsr    do_find
  20462.     cmpa.l    #NUL,a0
  20463.     bcc    err_fdn
  20464.     cmpi.w    #$8024,-18(a0)    *本当にNULか
  20465.     bne    fdn_lp01
  20466.     lea    -22(a0),a0
  20467. fdn_lp02:
  20468.     movea.l    a0,a1
  20469.     movea.l    (a1),a0        *最後尾を見付ける
  20470.     cmpa.l    #-1,a0
  20471.     bne    fdn_lp02
  20472.     lea    device_driver0,a0
  20473.     move.l    a0,(a1)
  20474.     moveq.l    #0,d0
  20475.     rts
  20476. err_fdn:
  20477.     moveq.l    #-1,d0
  20478.     rts
  20479.  
  20480. set_patch:                    *パッチ処理(常駐プログラムとしての変身)
  20481.     movem.l    d0-d1/a0,-(sp)
  20482.     lea    set_patch_tbl(pc),a0
  20483.     move.w    #NOP,d1
  20484. @@:
  20485.     move.l    (a0)+,d0
  20486.     beq    @f
  20487.     move.w    d1,(a6,d0.l)
  20488.     bra    @b
  20489. @@:
  20490. exit_chwp:
  20491.     bsr    cache_flush
  20492.     movem.l    (sp)+,d0-d1/a0
  20493.     rts
  20494.  
  20495. set_patch_tbl:
  20496.     dc.l    get_mem-work
  20497.     dc.l    enlarge_mem-work
  20498.     dc.l    free_mem-work
  20499.     dc.l    0
  20500.  
  20501. prt_help:            *簡易ヘルプの表示
  20502. *    bsr    prt_title
  20503.     lea    help_mes(pc),a1
  20504.     bra    err_exit
  20505.  
  20506. get_compile_work:            *コンパイルワークを設定
  20507.     * X d0 a0
  20508.     move.l    #gcw_size,-(sp)
  20509.     DOS    _MALLOC
  20510.     addq.w    #4,sp
  20511.     move.l    d0,zmc_work-work(a6)
  20512.     bmi    _out_mem_err
  20513.     move.l    d0,a1
  20514.     bra    split_wk
  20515.  
  20516. get_work_area:            *ワークエリアの確保
  20517. open_fn__:    equ    92
  20518. sr_fn_size:    equ    1024
  20519. arry_stock_len:    equ    1024
  20520. temp_buffer_len:    equ    1024
  20521. gcw_size:    equ    open_fn__*2+(t_trk_no_max+1)*2+sr_fn_size+open_fn__+arry_stock_len+temp_buffer_len
  20522.     lea.l    work_start(pc),a1
  20523. split_wk:
  20524.     move.l    a1,filename-work(a6)
  20525.     clr.b    (a1)
  20526.     lea    open_fn__(a1),a1
  20527.  
  20528.     move.l    a1,open_fn-work(a6)
  20529.     clr.b    (a1)
  20530.     lea    open_fn__(a1),a1
  20531.  
  20532.     move.l    a1,t_trk_no-work(a6)
  20533.     lea    (t_trk_no_max+1)*2(a1),a1
  20534.  
  20535.     move.l    a1,sr_filename-work(a6)
  20536.     clr.b    (a1)
  20537.     lea    sr_fn_size(a1),a1
  20538.  
  20539.     move.l    a1,sv_filename-work(a6)
  20540.     clr.b    (a1)
  20541.     lea    open_fn__(a1),a1
  20542.  
  20543.     move.l    a1,temp_buffer-work(a6)
  20544.     lea    temp_buffer_len(a1),a1
  20545.  
  20546.     move.l    a1,arry_stock-work(a6)
  20547.     lea    arry_stock_len(a1),a1
  20548.  
  20549.     move.l    a1,dev_end_adr-work(a6)
  20550.     move.w    #1,-(sp)
  20551.     pea    (a1)
  20552.     pea    (a1)
  20553.     DOS    _BUS_ERR        *メモリを過剰使用していないか
  20554.     lea    10(sp),sp
  20555.     tst.l    d0
  20556.     rts
  20557.  
  20558. prt_keep_info:                *常駐インフォーメーション(-GでRTSに)
  20559.     lea    linked_mes(pc),a1
  20560.     bra    bil_prta1
  20561.  
  20562. release:                *解除処理
  20563.     bsr    kep_chk            *常駐check
  20564.     bmi    not_kept        *常駐していない
  20565.     bne    illegal_ver        *バージョンが違う
  20566.  
  20567.     moveq.l    #0,d2            *d2=0
  20568.     move.l    d2,a1            *a1=0
  20569.     Z_MUSIC    #ZM_COMPILER        *解除(> a0.l=release addr)
  20570.     tst.l    d0
  20571.     bmi    release_err        *d0=-1:常駐解除失敗
  20572.     bne    case_occupied        *d0=1:占有されている
  20573.  
  20574.     pea    $10(a0)
  20575.     DOS    _MFREE
  20576.     addq.w    #4,sp
  20577.  
  20578.     bsr    prt_title
  20579.     bsr    release_mes
  20580.  
  20581.     move.l    ssp-work(a6),a1
  20582.     IOCS    _B_SUPER    *ユーザーモードへ戻る
  20583.  
  20584.     DOS    _EXIT
  20585.  
  20586. release_mes:
  20587.     lea    kaijo-work(a6),a1
  20588.     bra    bil_prta1
  20589.  
  20590. case_occupied:            *ZMUSICは占有されているので解除不可能
  20591.     lea    ocp_er_mes(pc),a1
  20592.     bra    err_exit
  20593.  
  20594. illegal_ver:            *VERSIONが違う
  20595.     lea    ver_er_mes(pc),a1
  20596.     bra    err_exit
  20597.  
  20598. release_err:            *解除不能の状態
  20599.     lea    rls_er_mes(pc),a1
  20600.     bra    err_exit
  20601.  
  20602. not_kept:            *常駐していないのか
  20603.     lea    not_kep_mes(pc),a1    *常駐していない
  20604.     bra    err_exit
  20605.  
  20606. chk_drv:            *デバイス名のcheck
  20607.     * > eq=no error
  20608.     * > mi=error
  20609.     * > (a1).w=version number
  20610.     move.l    $8c.w,a1
  20611.     subq.w    #8,a1
  20612.     cmpi.l    #'ZmuS',(a1)+
  20613.     bne    @f
  20614.     cmpi.w    #'iC',(a1)+
  20615.     bne    @f
  20616.     rts
  20617. @@:
  20618.     moveq.l    #-1,d0
  20619.     rts
  20620.  
  20621. kep_chk:            *分身が常駐しているか
  20622.     * > eq=exists
  20623.     * > ne=none
  20624.     move.l    a0work-work(a6),a0
  20625. @@:
  20626.     move.l    (a0),d0
  20627.     beq    klop1
  20628.     move.l    d0,a0
  20629.     bra    @b
  20630. klop1:
  20631.     move.l    12(a0),d0    *次のメモリ管理ポインタ
  20632.     beq    err_chk
  20633.     movea.l    d0,a2
  20634.     cmpa.l    a0work-work(a6),a2
  20635.     beq    klop_nxt    *自分自身じゃ意味無い
  20636.     lea    version_id-begin_of_prog+$100(a2),a1
  20637.     lea    version_id,a0
  20638.     cmpm.l    (a1)+,(a0)+
  20639.     bne    klop_nxt
  20640.     cmpm.w    (a1)+,(a0)+
  20641.     bne    klop_nxt
  20642.     cmpm.w    (a1)+,(a0)+
  20643.     bne    wrong_ver
  20644.     move.l    a2,a2work-work(a6)
  20645.     moveq.l    #0,d0        *分身の存在を確認
  20646.     rts
  20647. klop_nxt:
  20648.     move.l    a2,a0
  20649.     bra    klop1        *どんどんさかのぼる
  20650. err_chk:            *分身は無かった
  20651.     moveq.l    #-1,d0
  20652.     rts
  20653. wrong_ver:            *バージョンが違う
  20654.     moveq.l    #1,d0
  20655.     rts
  20656.  
  20657. compile_mode:                *コンパイラ
  20658.     bsr    get_src_zmd_name    *ファイル名等の取りだし(取り出していないなら)
  20659.  
  20660. *    lea    b_clr_st(pc),a1
  20661. *    bsr    prta1
  20662.     bsr    prt_title
  20663.  
  20664.     bsr    read_source        *ソースファイルのリード(a1=data address/d2=data size)
  20665.  
  20666.     tst.b    compile_type-work(a6)
  20667.     ble    @f
  20668.     move.l    a1,a0
  20669.     bra    go_calc            *絶対アドレスで計算
  20670. @@:
  20671.     move.l    a1,zms_addr-work(a6)
  20672.  
  20673.     moveq.l    #0,d1
  20674.     move.b    max_err_num(pc),d1    *d1.b=エラーがいくつ発生したらコンパイルを中断するか(0-127)
  20675.     ori.w    #ZMC_ERL,d1        *mode
  20676.     tst.b    v2_mode-work(a6)
  20677.     beq    @f
  20678.     ori.w    #ZMC_V2,d1
  20679. @@:
  20680.     jsr    compiler        *コンパイル実行ルーチンへ(< a1.l=addr,d1.l=mode,d2.l=size)
  20681. compiler_end:
  20682.     tst.l    d0
  20683.     bne    error_occurred        *エラー発生
  20684.     move.l    z_zmd_size(a0),d2    *出力ZMDの末端チェック
  20685.     tst.l    (a0,d2.l)        *ウォーニングがあるか
  20686.     beq    @f
  20687.     bsr    warning_occurred    *ウォーニング発生
  20688. @@:                    *ファイルの書き出し
  20689.     * < a0.l=zmd addr d2.l=size
  20690. go_calc:                *ステップタイム計算へ
  20691.     move.l    sv_filename(pc),a1
  20692.     lea    clc_ttl_header+1(pc),a2
  20693. @@:                    *ファイル名表示
  20694.     move.b    (a1)+,d0
  20695.     beq    @f
  20696.     move.b    d0,(a2)+
  20697.     bra    @b
  20698. @@:
  20699.     movem.l    d2/a0,-(sp)
  20700.     move.l    a0,a1
  20701.     bsr    calc_total        *> a0.l=information table
  20702.     tst.l    d0            *no error case
  20703.     beq    @f
  20704.     bsr    _error_occurred
  20705.     bra    create_zmd        *ZMD保存へ
  20706. @@:
  20707.     tst.b    disp_mode-work(a6)
  20708.     beq    @f
  20709.     move.l    (sp),d2            *d2=zmd size
  20710.     bsr    disprslt
  20711. @@:
  20712. create_zmd:
  20713.     movem.l    (sp)+,d2/a0
  20714.  
  20715.     tst.b    compile_type-work(a6)
  20716.     bgt    @f            *calc totalのみ
  20717.     move.w    #32,-(sp)
  20718.     move.l    sv_filename(pc),-(sp)
  20719.     DOS    _CREATE
  20720.     addq.w    #6,sp
  20721.     move.l    d0,d5            *d5.w=file handle
  20722.     bmi    _create_err
  20723.  
  20724.     move.l    d2,-(sp)    *data size
  20725.     pea    (a0)        *data addr
  20726.     move.w    d5,-(sp)
  20727.     DOS    _WRITE
  20728.     lea    10(sp),sp
  20729.     cmp.l    d0,d2
  20730.     bne    _write_err
  20731.  
  20732.     move.l    date_buf(pc),-(sp)
  20733.     move.w    d5,-(sp)
  20734.     DOS    _FILEDATE
  20735.     addq.w    #6,sp
  20736.  
  20737.     bsr    do_fclose
  20738. @@:
  20739.     tst.b    disp_mode-work(a6)
  20740.     beq    @f
  20741.     lea    no_err_mes(pc),a1        *no error at all
  20742.     bsr    bil_prta1
  20743. @@:
  20744.     move.l    ssp(pc),a1
  20745.     IOCS    _B_SUPER    *ユーザーモードへ戻る
  20746.  
  20747.     DOS    _EXIT
  20748.  
  20749.     include    disprslt.has
  20750.  
  20751. read_source:            *SOURCE FILEの読み込み
  20752.     * > a1.l=data address
  20753.     * > d2.l=data size
  20754.     tst.b    compile_type-work(a6)
  20755.     bne    compile_address    *アドレスモード
  20756.     move.l    sr_filename(pc),a4
  20757.     clr.w    -(sp)
  20758.     pea    (a4)
  20759.     DOS    _OPEN
  20760.     addq.w    #6,sp
  20761.     move.l    d0,d5        *d5.w=file handle
  20762.     bpl    1f
  20763. @@:
  20764.     tst.b    (a4)+
  20765.     bne    @b
  20766.     subq.l    #4,a4
  20767.     cmpi.b    #'Z',(a4)+
  20768.     bne    _read_err
  20769.     cmpi.b    #'M',(a4)+
  20770.     bne    _read_err
  20771.     cmpi.b    #'S',(a4)+
  20772.     bne    _read_err
  20773.     move.b    #'M',-(a4)
  20774.     move.b    #'P',-(a4)
  20775.     move.b    #'O',-(a4)
  20776.     bra    read_source
  20777. 1:
  20778.     bsr    get_fsize    *>d3.l=file size
  20779.     bmi    _read_err
  20780.     move.l    d3,d2
  20781.     addq.l    #1,d3        *endcode分
  20782.  
  20783.     move.l    d3,-(sp)    *data size
  20784.     DOS    _MALLOC
  20785.     addq.w    #4,sp
  20786.     tst.l    d0
  20787.     bmi    _out_mem_err
  20788.     movea.l    d0,a1        *a4=address
  20789.  
  20790.     move.l    d4,-(sp)    *size
  20791.     pea    (a1)        *address
  20792.     move.w    d5,-(sp)
  20793.     DOS    _READ
  20794.     lea    10(sp),sp
  20795.     tst.l    d0
  20796.     bmi    _read_err
  20797.     clr.b    (a1,d2.l)    *endcode念のため
  20798.  
  20799.     bsr    get_filedate
  20800.     move.l    d0,date_buf-work(a6)
  20801.  
  20802.     bra    do_fclose
  20803.  
  20804. compile_address:        *アドレスモード
  20805.     move.l    src_address(pc),a1
  20806.     move.l    src_size(pc),d2
  20807.     rts
  20808.  
  20809. warning_occurred:        *ウォーニング表示
  20810.     * < d2.l=zmd size
  20811.     * < a0.l=zmd addr
  20812.     movem.l    d0-d2/a0-a3,-(sp)
  20813.     lea    4(a0,d2.l),a0    *(a0,d2.l)はn_of_warn,4(a0,d2.l)がwarn_tbl
  20814.     move.b    errmes_lang-work(a6),d1
  20815.     move.l    n_of_warn(pc),d2
  20816.     move.l    sr_filename(pc),a3
  20817.     move.l    zms_addr(pc),a2
  20818.     move.l    sv_filename(pc),a1
  20819.     bsr    do_prt_err_mes
  20820.     movem.l    (sp)+,d0-d2/a0-a3
  20821.     rts
  20822.  
  20823. error_occurred:                *エラー表示
  20824.     * < a0.l=error table
  20825.     * - all
  20826.     pea    _end(pc)
  20827. _error_occurred:            *終了しないエントリ
  20828.     movem.l    d0-d2/a0-a3,-(sp)
  20829.     move.b    errmes_lang-work(a6),d1
  20830.     move.l    n_of_err(pc),d2
  20831.     add.l    n_of_warn(pc),d2    *!
  20832.     move.l    sr_filename(pc),a3
  20833.     move.l    zms_addr(pc),a2
  20834.     move.l    sv_filename(pc),a1
  20835.     bsr    do_prt_err_mes
  20836.     move.l    a0,a1
  20837.     bsr    free_mem
  20838.     movem.l    (sp)+,d0-d2/a0-a3
  20839.     rts
  20840.  
  20841. PUTCHAR    macro
  20842.     DOS    _PUTCHAR
  20843.     endm
  20844.  
  20845. PRINT    macro
  20846.     DOS    _PRINT
  20847.     endm
  20848.  
  20849.     .include    prterrms.has
  20850.     .include    zmerrmes.s    *エラーメッセージ
  20851.     .even
  20852.  
  20853. _out_mem_err:
  20854.     lea    out_mem_mes(pc),a1
  20855.     bra    __end
  20856. _read_err:            *READ ERROR
  20857.     move.l    sr_filename(pc),a1
  20858.     bsr    prta1
  20859.     lea    read_er_mes(pc),a1
  20860.     bra    __end
  20861. _create_err:            *CREATE ERROR
  20862.     move.l    sv_filename(pc),a1
  20863.     bsr    prta1
  20864.     lea    create_er_mes(pc),a1
  20865.     bra    __end
  20866. _write_err:            *WRITE ERROR
  20867.     move.l    sv_filename(pc),a1
  20868.  
  20869.     DOS    _ALLCLOSE
  20870.     pea    (a1)
  20871.     DOS    _DELETE
  20872.     addq.w    #4,sp
  20873.  
  20874.     bsr    prta1
  20875.     lea    write_er_mes(pc),a1
  20876. __end:
  20877.     bsr    bil_prta1
  20878. _end:
  20879.     move.l    n_of_err(pc),d0
  20880.     beq    err_exit0
  20881.     bsr    num_to_str
  20882.     lea    suji(pc),a1
  20883.     bsr    prta1
  20884.     bsr    play_beep    *警告音を鳴らす
  20885.     lea    how_many_err(pc),a1
  20886.     bra    err_exit    *エラーが発生した
  20887.  
  20888. work_start:
  20889. end_of_prog:
  20890.     .end    exec
  20891.